Mbed OS Reference
Loading...
Searching...
No Matches
SafeEnum< Target, LayoutType > Struct Template Reference

Helper class used to define safe enumerations. More...

#include <SafeEnum.h>

Public Types

typedef LayoutType representation_t
 Type of the representation. More...
 

Public Member Functions

LayoutType value () const
 Explicit access to the inner value of the SafeEnum instance. More...
 
const LayoutType * storage () const
 Return a pointer to the inner storage. More...
 

Protected Member Functions

 SafeEnum (LayoutType value)
 Construction of an enumeration value. More...
 

Detailed Description

template<typename Target, typename LayoutType = unsigned int>
struct ble::SafeEnum< Target, LayoutType >

Helper class used to define safe enumerations.

C++ 98 enums expose different security holes:

  • Scope The scope of the enum is the scope defining it. In other words, enumerator defined at namespace scope are in the same scope that other enumerator defined in that namespace even if they belong to a different enumeration. As a result it is really easy to collide names between two different enumerators. At the end, the programmer has to protect its declaration with long prefixing.
  • Unsafe comparison: enumerators really just are named integer and can be implicitly converted to integer. As a result it is possible to compare value of different enum type.
  • Layout: The layout type of enumerations is implementation defined.

This template class expose a framework to overcome those issues:

First enum has to be defined in a structure which inherit from this class. The target type is the name of the structure containing the enumeration while LayoutType is the inner type used to stored the enum.

Comparison operator are provided so it is not possible to compare a SafeEnum of a type to another SafeEnum of a different type.

Implicit conversion to integer is not defined, users have to either use the value function which return the integer value stored in an EnumType. Client class can also define their own conversion operation.

Template Parameters
Targetstructure containing the enumeration definition.
LayoutTypeInner type used to store enumeration value.
struct color_t : SafeEnum<color_t> {
enum type {
RED,
GREEN,
BLACK
};
color_t(type) : SafeEnum<color_t>(type) { }
};
// use an uint8_t to store the enumeration value
struct shape_t : SafeEnum<shape_t, uint8_t> {
enum type {
RECTANGLE,
CIRCLE,
TRIANGLE
};
shape_t(type) : SafeEnum<shape_t>(type) { }
};
// shape enumerator is in the shape_t scope.
shape_t shape = shape_t::RECTANGLE;
shape_t shape = color_t::RED; // Compilation error
if (shape == shape_t::CIRCLE) {
}
// compilation error
if (shape == color_t::RED) {
}
void sink(shape_t); (1)
void sink(color_t); (2)
sink(shape); // use overload (1)
sink(color); // use overload (2)
// explicit access to the value is mandatory when a SafeEnum value is used
// as the condition in a switch statement
switch(shape.value()) {
case shape_t::RECTANGLE:
break;
}
Helper class used to define safe enumerations.
SafeEnum(LayoutType value)
Construction of an enumeration value.

Definition at line 111 of file common/SafeEnum.h.

Member Typedef Documentation

◆ representation_t

typedef LayoutType representation_t

Type of the representation.

Definition at line 115 of file common/SafeEnum.h.

Constructor & Destructor Documentation

◆ SafeEnum()

SafeEnum ( LayoutType  value)
explicitprotected

Construction of an enumeration value.

Definition at line 121 of file common/SafeEnum.h.

Member Function Documentation

◆ value()

LayoutType value ( ) const

Explicit access to the inner value of the SafeEnum instance.

Definition at line 204 of file common/SafeEnum.h.

◆ storage()

const LayoutType * storage ( ) const

Return a pointer to the inner storage.

Definition at line 211 of file common/SafeEnum.h.