Skip to content

Commit

Permalink
iox-eclipse-iceoryx#1032 Add ErrorProxy
Browse files Browse the repository at this point in the history
Signed-off-by: Matthias Killat <[email protected]>
  • Loading branch information
MatthiasKillat committed Jun 17, 2022
1 parent 4bc23ed commit 9fe1c83
Show file tree
Hide file tree
Showing 5 changed files with 164 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,25 @@ using error_code_t = uint32_t;

enum class ModuleError : error_code_t
{
OutOfMemory = 0,
OutOfBounds = 1
None = 0,
OutOfMemory = 1,
OutOfBounds = 2
};

static const char* errorCodes[] = {"OutOfMemory", "OutOfBounds"};
static const char* errorCodes[] = {"None", "OutOfMemory", "OutOfBounds"};

error_code_t error_code_to_num(ModuleError code)
{
return (error_code_t) code;
}

// efficient array lookup requires consecuive numbers but this can be
// generated code
const char* error_code_to_name(error_code_t code)
{
return errorCodes[code];
}

const char* error_code_to_name(ModuleError code)
{
return errorCodes[(error_code_t)code];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,42 +1,14 @@
#pragma once

#include "error_codes.hpp" // this must be provided by the module
#include "error_levels.hpp" // do we want this dependency?
#include "location.hpp"
#include "proxy.hpp"

#include <iostream>
#include <type_traits>

namespace eh
{
void terminate()
{
std::cout << "TERMINATE" << std::endl;
}

template <class T>
struct is_fatal
{
static constexpr bool value = std::is_same<T, Fatal_t>::value;
};

// alternatively map to default error code
template <class Level>
void report(const SourceLocation& location, Level level)
{
auto name = error_level_to_name(level);
std::cout << name << "@" << location.file << " " << location.line << " " << location.function << std::endl;
}

template <class Level, class Code>
void report(const SourceLocation& location, Level level, Code code)
{
auto levelName = error_level_to_name(level);
auto codeName = error_code_to_name(code);
std::cout << levelName << "@" << location.file << " " << location.line << " " << location.function << " : "
<< codeName << std::endl;
}

#if 0
template <class Level>
void raise(const SourceLocation& location, Level level)
{
Expand All @@ -58,7 +30,6 @@ void raise(const SourceLocation& location, Level level, Code code)
terminate();
}
}

template <class Expr, class Level>
void raise_if(const SourceLocation& location, const Expr& expr, Level level)
{
Expand Down Expand Up @@ -88,5 +59,42 @@ void raise_if(const SourceLocation& location, const Expr& expr, Level level, Cod
}
}
}
#else
template <class Level>
ErrorProxy<Level> raise(const SourceLocation& location, Level level)
{
return ErrorProxy<Level>(location, level);
}

template <class Level, class Code>
ErrorProxy<Level> raise(const SourceLocation& location, Level level, Code code)
{
return ErrorProxy<Level>(location, level, code);
}

template <class Expr, class Level>
ErrorProxy<Level> raise_if(const SourceLocation& location, const Expr& expr, Level level)
{
if (expr())
{
return ErrorProxy<Level>(location, level);
}

// always created, bad
return ErrorProxy<Level>();
}

template <class Expr, class Level, class Code>
ErrorProxy<Level> raise_if(const SourceLocation& location, const Expr& expr, Level level, Code code)
{
if (expr())
{
return ErrorProxy<Level>(location, level, code);
}

// always created, bad
return ErrorProxy<Level>();
}
#endif

} // namespace eh
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ namespace eh
{
struct SourceLocation
{
const char* file;
unsigned line;
const char* function;
const char* file{nullptr};
unsigned line{0};
const char* function{nullptr};
};

} // namespace eh
Expand Down
108 changes: 108 additions & 0 deletions iceoryx_hoofs/include/iceoryx_hoofs/error_handling_2/proxy.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#pragma once

#include "error_codes.hpp" // this must be provided by the module
#include "error_levels.hpp" // do we want this dependency?
#include "location.hpp"

#include <iostream>
#include <type_traits>

namespace eh
{
void terminate()
{
std::cout << "TERMINATE" << std::endl;
}

template <class T>
struct is_fatal
{
static constexpr bool value = std::is_same<T, Fatal_t>::value;
};

// alternatively map to default error code
template <class Level>
void report(const SourceLocation& location, Level level)
{
auto name = error_level_to_name(level);
std::cout << name << "@" << location.file << " " << location.line << " " << location.function << std::endl;
}

template <class Level, class Code>
void report(const SourceLocation& location, Level level, Code code)
{
auto levelName = error_level_to_name(level);
auto codeName = error_code_to_name(code);
std::cout << levelName << "@" << location.file << " " << location.line << " " << location.function << " : "
<< codeName << std::endl;
}

template <class Level>
void report(const SourceLocation& location, Level level, error_code_t code)
{
auto levelName = error_level_to_name(level);
auto codeName = error_code_to_name(code);
std::cout << levelName << "@" << location.file << " " << location.line << " " << location.function << " : "
<< codeName << std::endl;
}

// kind of an exception
template <class Level>
struct ErrorProxy
{
ErrorProxy()
{
}

ErrorProxy(const SourceLocation& location, Level level)
: location(location)
, level(level)
, code(0) // fix magic number for no code
{
error = true;
}

template <class Code>
ErrorProxy(const SourceLocation& location, Level level, Code code)
: location(location)
, level(level)
, code(error_code_to_num(code))
{
error = true;
}

ErrorProxy(const ErrorProxy&) = delete;

ErrorProxy(ErrorProxy&&)
{
// should not be used (exists for RVO in C++14)
std::terminate();
}

~ErrorProxy()
{
if (error)
{
// can be compile time dispatched later
if (code > 0)
{
report(location, level, code);
}
else
{
report(location, level);
}
if (is_fatal<Level>::value)
{
terminate();
}
}
}

SourceLocation location;
Level level;
error_code_t code;
bool error{false};
};

} // namespace eh
1 change: 0 additions & 1 deletion iceoryx_hoofs/test/moduletests/test_error_handling_2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,4 @@ TEST(EH_test, assert)
IOX_ASSERT(x < 10, ModuleError::OutOfBounds);
IOX_ASSERT(x < 10);
}

} // namespace

0 comments on commit 9fe1c83

Please sign in to comment.