// RuntimeForStatic base library | C+- (SysRoutine) | Author: Sergei Y.Kitáev
#include "Precompiled.h"
#include "SharedIncludes.h"
namespace RuntimeForStatic {
//==================================================================================================

$AutoHandle::$AutoHandle($A, HANDLE volatile* pHandle )
: $AutoHandle($ci, false, pHandle )
{}
$AutoHandle::$AutoHandle($A, bool isOfInvalidHandleValueCategory,
                             HANDLE volatile* pHandle )
{
   $$VERIFY_POINTER_ARG( pHandle );
   _PHandle_ = pHandle;
   _IsOfInvalidHandleValueCategory_ = isOfInvalidHandleValueCategory;
   ValidateDisposable($$);
}

//==================================================================================================

void $AutoHandle::DoDispose($CI_REF)
{
   Close($ci);
}

void $AutoHandle::ResetSuperstructure()
{
   _PHandle_ = nullptr;
   _IsOfInvalidHandleValueCategory_ = false;
}

//==================================================================================================

bool $AutoHandle::Close($O) $last_system_error
{
   if ( !IsValidDisposable )
      return $Win32Error::ResetLastSysError();
   $$VERIFY_VALID_DISPOSABLE();
   HANDLE handle = $Handle::Exchange($, _PHandle_,
      _IsOfInvalidHandleValueCategory_ ? INVALID_HANDLE_VALUE : nullptr );
   bool isOfInvalidHandleValueCategory = _IsOfInvalidHandleValueCategory_;
   ResetSuperstructure();
   InvalidateDisposable();
   return $Handle::IsValid( handle, isOfInvalidHandleValueCategory ) ?
      $BOOL( ::CloseHandle( handle ) ) : $Win32Error::ResetLastSysError();
}

void $AutoHandle::Neutralize()
{
   InvalidateDisposable();
}

//==================================================================================================
} // RuntimeForStatic
