ALib C++ Framework
by
Library Version: 2511 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
alib::boxing::Enum Struct Reference

Description:

This class is useful to pass and accept enum values of arbitrary C++ scoped enum types. Based on class Box, all interfaces are inherited, including type guessing and unboxing.

In the constructor, enum elements of an arbitrary type are accepted. The element's underlying integral value is boxed, and thus run-time type-information is added. Having the "original" element stored in protected base class Box, has the following advantages:

Note
The implementation of this class, by deriving from class Box, introduces a small memory overhead (usually 8 bytes per instance on 64-bit system), in respect to a possible alternative "direct" implementation. This is due to the fact that boxing allows one-dimensional array types to be boxed as well as scalar types - which is never the case with this class.
But the advantages of doing so certainly surpasses this small drawback.
Class Box is inherited protected instead of public, to hide bigger portions of the base class's interface. While some functions are explicitly made visible with keyword using, for others, instances of this class have to be cast first. Casting is done with overloaded methods CastToBox.

Functors In Namespace std

Functors std::hash, std::equal_to and std::less are specialized for this type with the inclusion of the header-file ALib.Boxing.StdFunctors.H as documented with namespace alib::boxingcompatibility::std.

Friends

class Box

See also
With the inclusion of the module ALib EnumRecords in the ALib Build, the namespace functions GetRecord and TryRecord become available, which receive an enum record for a value of this class.

Definition at line 46 of file enum.inl.

Inheritance diagram for alib::boxing::Enum:
alib::boxing::Box

Public Method Index:

 Enum ()
 Default constructor.
template<typename TEnum>
constexpr Enum (TEnum element)
BoxCastToBox ()
const BoxCastToBox () const
template<typename TEnum>
TEnum Get () const
size_t Hashcode () const
template<typename TIntegral = integer>
TIntegral Integral () const
template<typename TEnum>
bool IsEnumType () const
bool IsNotNull () const
bool IsNull () const
bool operator!= (const Enum &rhs) const
template<typename TEnum>
bool operator!= (TEnum rhs) const
bool operator< (Enum const &rhs) const
bool operator== (const Enum &rhs) const
template<typename TEnum>
bool operator== (TEnum rhs) const
const std::type_info & TypeID () const

Additional Inherited Members

Protected Type Index: inherited from alib::boxing::Box
using TypeCode = uinteger
 The type of type codes received with ExportType.
Protected Static Method Index: inherited from alib::boxing::Box
template<typename TBoxable>
static constexpr detail::VTablegetVTable ()
Protected Field Index: inherited from alib::boxing::Box
Placeholder data
 The data that we encapsulate.
detail::VTablevtable
Protected Method Index: inherited from alib::boxing::Box
template<typename T>
constexpr void initPH (const T &src) noexcept
 Box () noexcept
template<typename TBoxable>
constexpr Box (const TBoxable &src) noexcept
 Box (TypeCode typeCode, const Placeholder &placeholder) noexcept
size_t ArrayElementSize () const
template<typename TFDecl, typename... TArgs>
decltype(std::declval< typename TFDecl::Signature >()(std::declval< Box & >(), std::declval< TArgs >()...)) Call (TArgs &&... args)
template<typename TFDecl, typename... TArgs>
decltype(std::declval< typename TFDecl::Signature >()(std::declval< Box & >(), std::declval< TArgs >()...)) Call (TArgs &&... args) const
template<typename TFDecl, typename... TArgs>
decltype(std::declval< typename TFDecl::Signature >()(std::declval< Box & >(), std::declval< TArgs >()...)) CallDirect (typename TFDecl::Signature function, TArgs &&... args)
template<typename TFDecl, typename... TArgs>
decltype(std::declval< typename TFDecl::Signature >()(std::declval< Box & >(), std::declval< TArgs >()...)) CallDirect (typename TFDecl::Signature function, TArgs &&... args) const
void Clone (MonoAllocator &memory)
PlaceholderData ()
const PlaceholderData () const
const detail::VTableDbgGetVTable () const
const std::type_info & ElementTypeID () const
TypeCode ExportType () const
Placeholder ExportValue () const
template<typename TFDecl>
TFDecl::Signature GetFunction (Reach searchScope, bool isInvocation=false) const
unsigned GetPlaceholderUsageLength () const
size_t Hashcode () const
void Import (TypeCode typeCode)
void Import (TypeCode typeCode, const Placeholder &placeholder)
bool IsArray () const
template<typename TElementType>
bool IsArrayOf () const
bool IsCharacter () const
bool IsEnum () const
bool IsFloatingPoint () const
bool IsNotNull () const
bool IsNull () const
bool IsPointer () const
bool IsSameType (const Box &other) const
bool IsSignedIntegral () const
template<typename TBoxable>
bool IsType () const
bool IsUnsignedIntegral () const
 operator bool () const
bool operator!= (const Box &rhs) const
bool operator< (Box const &rhs) const
bool operator<= (Box const &rhs) const
bool operator== (Box const &rhs) const
bool operator> (Box const &rhs) const
bool operator>= (Box const &rhs) const
const std::type_info & TypeID () const
template<typename TValue>
TValue Unbox ()
template<typename TElementType>
TElementType * UnboxArray () const
wchar UnboxCharacter () const
template<typename TElementType>
TElementType & UnboxElement (integer idx) const
double UnboxFloatingPoint () const
integer UnboxLength () const
template<typename TPointer>
TPointer UnboxMutable () const
integer UnboxSignedIntegral () const
uinteger UnboxUnsignedIntegral () const

Constructor(s) / Destructor Details:

◆ Enum() [1/2]

alib::boxing::Enum::Enum ( )
inline

Default constructor.

Definition at line 53 of file enum.inl.

◆ Enum() [2/2]

template<typename TEnum>
alib::boxing::Enum::Enum ( TEnum element)
inlineconstexpr

Implicit constructor, which accepts arbitrary elements of scoped or non-scoped enum types.

Template Parameters
TEnumThe external (user specific) enumeration type.
Parameters
elementThe external (user specific) enumeration element.

Definition at line 62 of file enum.inl.

Method Details:

◆ CastToBox() [1/2]

Box & alib::boxing::Enum::CastToBox ( )
inline

This method casts an instance of this class to a reference of base class Box. To hide the bases class's interface, this class inherits class Box only as a protected base. With this method, this "artificial limitation " (its a design decision) is lifted.

Returns
A mutable reference to this object.

Definition at line 124 of file enum.inl.

◆ CastToBox() [2/2]

const Box & alib::boxing::Enum::CastToBox ( ) const
inline

Same as overloaded version, but returns a const reference and consequently this method is declaredconst itself.

Returns
A constant reference to this object.

Definition at line 130 of file enum.inl.

◆ Get()

template<typename TEnum>
TEnum alib::boxing::Enum::Get ( ) const
inline

This is a shortcut to Box::Unbox() to retrieve the original enum element in a type-safe way.

Before invoking this, the boxed type can be checked with IsType. If the wrong type is tried to be received, an ALib Assertion is raised.

Template Parameters
TEnumThe external (user specific) enumeration type.
Returns
The underlying integral value of the encapsulated enum element.

Definition at line 75 of file enum.inl.

◆ Hashcode()

size_t alib::boxing::Box::Hashcode ( ) const

Imports protected base class's method Hashcode.

Returns
A hashcode for the boxed enum type and value.

◆ Integral()

template<typename TIntegral = integer>
TIntegral alib::boxing::Enum::Integral ( ) const
inline

Returns the underlying integral value of the original enum element cast to type TIntegral.

Note
Boxed enum element values are always stored as type integer, regardless of the underlying type of the enumeration.
Template Parameters
TIntegralThe requested width of the return type. Defaults to integer.
Returns
The underlying integral value.

Definition at line 88 of file enum.inl.

◆ IsEnumType()

template<typename TEnum>
bool alib::boxing::Enum::IsEnumType ( ) const
inline

Checks if this instance has an enum element of type TEnum stored.
This method is an inlined, simple alias for protected base class's method IsType.

Template Parameters
TEnumThe external (user specific) enumeration type.
Returns
true if the encapsulated enum type of type TEnum, otherwise false.

Definition at line 142 of file enum.inl.

◆ IsNotNull()

bool alib::boxing::Enum::IsNotNull ( ) const
inline

Returns the negated result IsNull.

Returns
true if this object contains with an enumeration element, false otherwise.

Definition at line 155 of file enum.inl.

◆ IsNull()

bool alib::boxing::Enum::IsNull ( ) const
inline
Note
This method overrides the otherwise protected inherited method of class Box but also changes its meaning slightly. Here, no boxing function is called, instead it is checked whether the box is set at all. Specifically, this method returns Box::IsType<void>().
Returns
false if this object contains an enumeration element, true otherwise.

Definition at line 150 of file enum.inl.

◆ operator!=() [1/2]

bool alib::boxing::Enum::operator!= ( const Enum & rhs) const
inline

Comparison operator.

Parameters
rhsThe right-hand side argument of the comparison.
Returns
true if this object does not equal rhs, false otherwise.

Definition at line 103 of file enum.inl.

◆ operator!=() [2/2]

template<typename TEnum>
bool alib::boxing::Enum::operator!= ( TEnum rhs) const
inline

Comparison operator with enum elements.

Template Parameters
TEnumThe external (user specific) enumeration type.
Parameters
rhsThe right-hand side argument of the comparison.
Returns
true if this object does not equal rhs, false otherwise.

Definition at line 177 of file enum.inl.

◆ operator<()

bool alib::boxing::Enum::operator< ( Enum const & rhs) const
inline

Comparison operator with another Enum object. The sort order is primarily determined by the enum types that were boxed. If those are the same, then the underlying integral value of the enum elements is compared.

This leads to a nested sort order, with the type information being the outer order and the integral value of the enum being the inner one.

Note
It is a matter of the compiler how the outer sort of types is performed and thus this cannot be determined by the user code.
Parameters
rhsThe right-hand side argument of the comparison.
Returns
If the encapsulated type of this instance is the same as that of rhs, this methods returns true if Integral of this object is smaller than the one of rhs and otherwise false. If the types are not the same, than the result is dependent on the tool chain (compiler) used for compiling ALib.

Definition at line 199 of file enum.inl.

◆ operator==() [1/2]

bool alib::boxing::Enum::operator== ( const Enum & rhs) const
inline

Comparison operator.

Parameters
rhsThe right-hand side argument of the comparison.
Returns
true if this object equals rhs, false otherwise.

Definition at line 94 of file enum.inl.

◆ operator==() [2/2]

template<typename TEnum>
bool alib::boxing::Enum::operator== ( TEnum rhs) const
inline

Comparison operator with enum elements.

Template Parameters
TEnumThe external (user specific) enumeration type.
Parameters
rhsThe right-hand side argument of the comparison.
Returns
true if this object equals rhs, false otherwise.

Definition at line 165 of file enum.inl.

◆ TypeID()

const std::type_info & alib::boxing::Box::TypeID ( ) const
inline

Imports protected base class's method TypeID.

Returns
The std::type_info of the mapped enum type.

Definition at line 766 of file box.inl.


The documentation for this struct was generated from the following file: