Added operators to BoxedObject, fixed MappintIterator for reference types and fixed signature of custom assertion and error handlers.
This commit is contained in:
parent
2cc0f74d06
commit
7c1dd29a85
@ -32,13 +32,14 @@ class BoxedObject
|
||||
{
|
||||
private:
|
||||
union {
|
||||
std::byte placeholder_;
|
||||
T object_;
|
||||
};
|
||||
#if MIJIN_BOXED_OBJECT_DEBUG
|
||||
bool constructed = false;
|
||||
#endif
|
||||
public:
|
||||
BoxedObject() = default;
|
||||
BoxedObject() noexcept : placeholder_() {};
|
||||
explicit BoxedObject(T object)
|
||||
#if MIJIN_BOXED_OBJECT_DEBUG
|
||||
: constructed(true)
|
||||
@ -59,6 +60,11 @@ public:
|
||||
BoxedObject& operator=(const BoxedObject&) = delete;
|
||||
BoxedObject& operator=(BoxedObject&&) = delete;
|
||||
|
||||
T& operator*() noexcept { return get(); }
|
||||
const T& operator*() const noexcept { return get(); }
|
||||
T* operator->() noexcept { return &get(); }
|
||||
const T* operator->() const noexcept { return &get(); }
|
||||
|
||||
template<typename... TArgs>
|
||||
void construct(TArgs&&... args)
|
||||
{
|
||||
|
@ -138,6 +138,10 @@ public:
|
||||
constexpr explicit operator bool() const noexcept { return !empty(); }
|
||||
[[nodiscard]]
|
||||
constexpr bool operator !() const noexcept { return empty(); }
|
||||
[[nodiscard]]
|
||||
constexpr std::remove_reference_t<TValue>& operator*() noexcept { return get(); }
|
||||
[[nodiscard]]
|
||||
constexpr const std::remove_reference_t<TValue>& operator*() const noexcept { return get(); }
|
||||
public:
|
||||
template<typename... Types>
|
||||
void emplace(Types&&... params) noexcept;
|
||||
|
@ -28,7 +28,7 @@ namespace mijin
|
||||
|
||||
#if MIJIN_DEBUG
|
||||
|
||||
#define MIJIN_DO_RAISE_ERROR(msg, source_loc) \
|
||||
#define MIJIN_RAISE_ERROR(msg, source_loc) \
|
||||
switch (mijin::handleError(msg, source_loc)) \
|
||||
{ \
|
||||
case mijin::ErrorHandling::CONTINUE: \
|
||||
@ -40,10 +40,8 @@ switch (mijin::handleError(msg, source_loc)) \
|
||||
std::abort(); \
|
||||
}
|
||||
|
||||
#define MIJIN_RAISE_ERROR(msg, func, file, line) MIJIN_DO_RAISE_ERROR(msg, func, file, line)
|
||||
|
||||
#define MIJIN_ERROR(msg) \
|
||||
MIJIN_DO_RAISE_ERROR(msg, std::source_location::current())
|
||||
MIJIN_RAISE_ERROR(msg, std::source_location::current())
|
||||
|
||||
#define MIJIN_FATAL(msg) \
|
||||
MIJIN_ERROR(msg) \
|
||||
@ -57,7 +55,7 @@ if (!static_cast<bool>(condition))
|
||||
if (true) /*!ignoreAll */ \
|
||||
{ \
|
||||
const mijin::AssertionResult assertion_result__ = mijin::handleAssert( \
|
||||
#condition, msg, MIJIN_FUNC(), __FILE__, __LINE__); \
|
||||
#condition, msg, std::source_location::current()); \
|
||||
switch (assertion_result__) \
|
||||
{ \
|
||||
case mijin::AssertionResult::ABORT: \
|
||||
@ -116,20 +114,17 @@ enum class ErrorHandling
|
||||
|
||||
#ifdef MIJIN_USE_CUSTOM_ASSERTION_HANDLER
|
||||
AssertionResult handleAssert(const char* condition,
|
||||
const char* message, const char* function,
|
||||
const char* file, int line) noexcept;
|
||||
const char* message, const std::source_location& location);
|
||||
#else
|
||||
constexpr AssertionResult handleAssert(const char* /* condition */,
|
||||
const char* /* message */, const char* /* function */,
|
||||
const char* /* file */, int /* line */)
|
||||
const char* /* message */, const std::source_location& /* location */)
|
||||
{
|
||||
return AssertionResult::ERROR;
|
||||
}
|
||||
#endif // MIJIN_USE_CUSTOM_ASSERTION_HANDLER
|
||||
|
||||
#ifdef MIJIN_USE_CUSTOM_ERROR_HANDLER
|
||||
ErrorHandling handleError(const char* message, const char* function,
|
||||
const char* file, int line) noexcept;
|
||||
ErrorHandling handleError(const char* message, const std::source_location& location);
|
||||
#else
|
||||
inline ErrorHandling handleError(const char* message, const std::source_location& location) noexcept
|
||||
{
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <string_view>
|
||||
#include <tuple>
|
||||
#include <variant>
|
||||
#include "../container/optional.hpp"
|
||||
|
||||
namespace mijin
|
||||
{
|
||||
@ -277,7 +278,7 @@ struct MappingIterator
|
||||
{
|
||||
using orig_value_type = typename std::iterator_traits<TIterator>::value_type;
|
||||
using difference_type = std::ptrdiff_t;
|
||||
using value_type = std::invoke_result_t<TFunctor, orig_value_type>;
|
||||
using value_type = std::invoke_result_t<TFunctor, orig_value_type&>;
|
||||
using reference = value_type&;
|
||||
using iterator_category = std::bidirectional_iterator_tag; // TODO?
|
||||
|
||||
@ -285,7 +286,7 @@ struct MappingIterator
|
||||
|
||||
TIterator base;
|
||||
TFunctor functor;
|
||||
mutable std::optional<value_type> result;
|
||||
mutable Optional<value_type> result;
|
||||
|
||||
MappingIterator(TIterator base_, TFunctor functor_) noexcept : base(base_), functor(std::move(functor_)) {}
|
||||
MappingIterator(const MappingIterator&) noexcept = default;
|
||||
@ -296,8 +297,8 @@ struct MappingIterator
|
||||
|
||||
reference operator*() const noexcept
|
||||
{
|
||||
if (!result.has_value()) {
|
||||
result = functor(*base);
|
||||
if (result.empty()) {
|
||||
result = std::invoke(functor, *base);
|
||||
}
|
||||
return *result;
|
||||
}
|
||||
@ -305,7 +306,7 @@ struct MappingIterator
|
||||
MappingIterator& operator++() noexcept
|
||||
{
|
||||
++base;
|
||||
result = std::nullopt;
|
||||
result.reset();
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -319,7 +320,7 @@ struct MappingIterator
|
||||
MappingIterator& operator--() noexcept
|
||||
{
|
||||
--base;
|
||||
result = std::nullopt;
|
||||
result.reset();
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user