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

void $FatalError::RaiseFunctionFailure($CI_REF,PCWSTR functionName) $not_returns
{
   RaiseFmt($$CI, $TEXT(
      L"Function “%s” has failed.",
      L"Функция “%s” потерпела неудачу." ),
      $_( functionName, L"???" ));
}

void $FatalError::RaiseWin32Error($CI_REF,DWORD dwError) $not_returns
{
   PWSTR
      pSysErrorMessage = HelpersRT::GetSystemMessage($, dwError ),
      pErrorText = pSysErrorMessage ?
         HelpersRT::FormatAlloc($, $TEXT(
            L"%s\r\nSystem error code: %d (0x%.8X).",
            L"%s\r\nКод системной ошибки: %d (0x%.8X)." ),
            pSysErrorMessage, dwError, dwError ) :
         HelpersRT::FormatAlloc($, $TEXT(
            L"System error with code %d (0x%.8X).",
            L"Системная ошибка с кодом %d (0x%.8X)." ),
            dwError, dwError );
   Raise($$CI, VerifyFormatAlloc($$, pErrorText ));
}
void $FatalError::RaiseWin32FuncFailure($CI_REF,PCWSTR win32FunctionName) $not_returns
{
   RaiseFmt($$CI, $TEXT(
      L"Win32-function “%s” has failed.",
      L"Функция Win32 “%s” потерпела неудачу." ),
      $_( win32FunctionName, L"???" ));
}
void $FatalError::RaiseLastSystemError($CI_REF) $not_returns
{
   RaiseWin32Error($$CI, ::GetLastError() );
}

void $FatalError::RaiseLastError($CI_REF) $not_returns $requires_rt_n_thread_init
{
   Raise($$CI, $LE::MessagePointerTD() );
}

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

void $FatalError::RaiseInvalidOperation($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Invalid operation.",
      L"Недопустимая операция." ));
}

void $FatalError::RaiseInvalidOperationWithMessage($CI_REF,PCWSTR message) $not_returns
{
   RaiseFmt($$CI, $TEXT(
      L"Invalid operation.\r\n%s",
      L"Недопустимая операция.\r\n%s" ),
      $_( message, L"???" ));
}
void $FatalError::RaiseInvalidOperationWithMessageFmt($CI_REF,PCWSTR messageFmt, ... ) $not_returns
{
   $$VERIFY_POINTER_ARG( messageFmt );
   va_list argList;
   RaiseInvalidOperationWithMessageVA($$CI, $VA_COMPLEMENT( messageFmt, argList ) );
}
void $FatalError::RaiseInvalidOperationWithMessageVA($CI_REF, PCWSTR messageFmt,
                                                              va_list argList ) $not_returns
{
   $$VERIFY_POINTER_ARG( messageFmt );
   $$VERIFY_POINTER_ARG( argList );
   PWSTR pMessage = HelpersRT::FormatAllocVA($$, messageFmt, argList );
   RaiseInvalidOperationWithMessage($$CI, VerifyFormatAlloc($$, pMessage ));
}

//--------------------------------------------------------------------------------------------------

void $FatalError::RaiseZeroValue($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Value must not be equal to zero.",
      L"Значение не должно равняться нулю." ));
}
void $FatalError::RaiseNegativeValue($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Value must not be negative.",
      L"Значение не должно быть отрицательным." ));
}
void $FatalError::RaiseNotPozitiveValue($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Value must be greater than zero.",
      L"Значение должно быть больше нуля." ));
}

void $FatalError::RaiseNullPointer($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Pointer must not be null.",
      L"Указатель не должен быть нул-ом." ));
}

void $FatalError::RaiseNullTarget($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Target must not be null.",
      L"Цель не должен быть нул-ом." ));
}
void $FatalError::RaiseNullHandle($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Handle must not be null.",
      L"Дескриптор не должен быть нул-ом." ));
}
void $FatalError::RaiseInvalidHandleValue($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Handle must not be invalid (INVALID_HANDLE_VALUE).",
      L"Дескриптор не должен быть недействительным (INVALID_HANDLE_VALUE)." ));
}

//--------------------------------------------------------------------------------------------------

void $FatalError::RaiseNotValidDisposable($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Invalid state of disposable object ($Disposable class).",
      L"Недействительное состояние объёкта диспозиции ($Disposable class)." ));
}
void $FatalError::RaiseDisposableWasAlreadyCreated($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Disposable object was already created ($Disposable class).",
      L"Объект диспозиции уже создавался ($Disposable class)." ));
}

//--------------------------------------------------------------------------------------------------

void $FatalError::RaiseDeadCodeBranch($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Dead branch of program code execution.",
      L"Тупиковая ветка исполнения программного кода." ));
}
void $FatalError::RaiseNotImplemented($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Function or method was not implemented",
      L"Функция или метод не был(а) реализован(а)." ));
}

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

void $FatalError::RaiseAssertionFailure($CI_REF) $not_returns
{
   Raise($$CI, $TEXT(
      L"Assertion in sourse code has failed.",
      L"Утверждение в исходном коде потерпело неудачу." ));
}
void $FatalError::RaiseAssertionFailure($CI_REF,PCWSTR conditionExp $optional) $not_returns
{
   if ( conditionExp )
      RaiseFmt($$CI, $TEXT(
         L"Assertion in sourse code has failed.\r\n"
         L"The following condition is not true:\r\n"
         L"“%s”.",
         L"Утверждение в исходном коде потерпело неудачу.\r\n"
         L"Следующее условие не выполняется:\r\n"
         L"“%s”." ),
         conditionExp );
   RaiseAssertionFailure($$CI);
}

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

void $FatalError::RaiseMemoryAllocationFailure() $not_returns
{
   Raise($$, $StaticMessages::MemoryAllocationFailure() );
}

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