Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,32 @@ Define this to the pod-type you want to align to (no default).
\-D<b>variant\_CONFIG\_ALIGN\_AS\_FALLBACK</b>=*pod_type*
Define this to the pod-type to use for alignment if the algorithm of *variant lite* cannot find a suitable POD type to use for alignment. Default is `double`.

#### Override `bad_variant_access`
<b>variant_CONFIG_BAD_VARIANT_ACCESS</b>=type

Define this macro to override the default definition of `bad_variant_access`.

This is useful when integrating with other compatibility libraries or the standard library to avoid conflicting exception types.

Example:
```cpp
#define variant_CONFIG_BAD_VARIANT_ACCESS std::bad_variant_access
```
If not defined, variant-lite uses its own `nonstd::bad_variant_access`.

#### Override `monostate`
<b>variant_CONFIG_MONOSTATE</b>=type

Define this macro to override the default `monostate` type used by variant-lite.

This helps prevent type conflicts when multiple libraries define their own monostate.

Example:
```cpp
#define variant_CONFIG_MONOSTATE std::monostate
```
If not defined, variant-lite uses its own `nonstd::monostate`.

## Reported to work with

The table below mentions the compiler versions *variant lite* is reported to work with.
Expand Down
13 changes: 10 additions & 3 deletions include/nonstd/variant.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1212,16 +1212,19 @@ class variant;

// 19.7.8 Class monostate

#ifdef variant_CONFIG_MONOSTATE
using variant_CONFIG_MONOSTATE;
#else
class monostate{};

// 19.7.9 monostate relational operators

inline variant_constexpr bool operator< ( monostate, monostate ) variant_noexcept { return false; }
inline variant_constexpr bool operator> ( monostate, monostate ) variant_noexcept { return false; }
inline variant_constexpr bool operator<=( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator>=( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator==( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator!=( monostate, monostate ) variant_noexcept { return false; }
#endif

// 19.7.4 variant helper classes

Expand Down Expand Up @@ -1280,6 +1283,9 @@ static const std::size_t variant_npos = static_cast<std::size_t>( -1 );

// 19.7.11 Class bad_variant_access

#ifdef variant_CONFIG_BAD_VARIANT_ACCESS
using variant_CONFIG_BAD_VARIANT_ACCESS;
#else
class variant_nodiscard bad_variant_access : public std::exception
{
public:
Expand All @@ -1292,6 +1298,7 @@ class variant_nodiscard bad_variant_access : public std::exception
return "bad variant access";
}
};
#endif

#endif // variant_CONFIG_NO_EXCEPTIONS

Expand Down Expand Up @@ -2698,7 +2705,7 @@ using namespace variants;

} // namespace nonstd

#if variant_CPP11_OR_GREATER
#if ! defined (variant_CONFIG_MONOSTATE) && variant_CPP11_OR_GREATER

// 19.7.12 Hash support

Expand Down Expand Up @@ -2746,7 +2753,7 @@ struct hash< nonstd::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T

} //namespace std

#endif // variant_CPP11_OR_GREATER
#endif // ! defined (variant_CONFIG_MONOSTATE) && variant_CPP11_OR_GREATER

#if variant_BETWEEN( variant_COMPILER_MSVC_VER, 1300, 1900 )
# pragma warning( pop )
Expand Down
13 changes: 10 additions & 3 deletions template/variant.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1087,16 +1087,19 @@ class variant;

// 19.7.8 Class monostate

#ifdef variant_CONFIG_MONOSTATE
using variant_CONFIG_MONOSTATE;
#else
class monostate{};

// 19.7.9 monostate relational operators

inline variant_constexpr bool operator< ( monostate, monostate ) variant_noexcept { return false; }
inline variant_constexpr bool operator> ( monostate, monostate ) variant_noexcept { return false; }
inline variant_constexpr bool operator<=( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator>=( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator==( monostate, monostate ) variant_noexcept { return true; }
inline variant_constexpr bool operator!=( monostate, monostate ) variant_noexcept { return false; }
#endif // variant_CONFIG_MONOSTATE

// 19.7.4 variant helper classes

Expand Down Expand Up @@ -1155,6 +1158,9 @@ static const std::size_t variant_npos = static_cast<std::size_t>( -1 );

// 19.7.11 Class bad_variant_access

#ifdef variant_CONFIG_BAD_VARIANT_ACCESS
using variant_CONFIG_BAD_VARIANT_ACCESS;
#else
class variant_nodiscard bad_variant_access : public std::exception
{
public:
Expand All @@ -1167,6 +1173,7 @@ class variant_nodiscard bad_variant_access : public std::exception
return "bad variant access";
}
};
#endif // variant_CONFIG_BAD_VARIANT_ACCESS

#endif // variant_CONFIG_NO_EXCEPTIONS

Expand Down Expand Up @@ -2043,7 +2050,7 @@ using namespace variants;

} // namespace nonstd

#if variant_CPP11_OR_GREATER
#if ! defined (variant_CONFIG_MONOSTATE) && variant_CPP11_OR_GREATER

// 19.7.12 Hash support

Expand Down Expand Up @@ -2077,7 +2084,7 @@ struct hash< nonstd::variant<{{TplArgsList}}> >

} //namespace std

#endif // variant_CPP11_OR_GREATER
#endif // ! defined (variant_CONFIG_MONOSTATE) && variant_CPP11_OR_GREATER

#if variant_BETWEEN( variant_COMPILER_MSVC_VER, 1300, 1900 )
# pragma warning( pop )
Expand Down
Loading