Silicium
Macros
trait.hpp File Reference
#include <silicium/to_unique.hpp>
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/array/size.hpp>
#include <boost/preprocessor/array/elem.hpp>
#include <boost/preprocessor/enum_params.hpp>

Go to the source code of this file.

Macros

#define SILICIUM_MOVABLE_MEMBER(struct_name, member_name)
 
#define SILICIUM_DETAIL_MAKE_PARAMETER(z, n, array)   BOOST_PP_COMMA_IF(n) BOOST_PP_ARRAY_ELEM(n, array) BOOST_PP_CAT(arg, n)
 
#define SILICIUM_DETAIL_MAKE_PARAMETERS(array)   ( BOOST_PP_REPEAT(BOOST_PP_ARRAY_SIZE(array), SILICIUM_DETAIL_MAKE_PARAMETER, array) )
 
#define SILICIUM_DETAIL_MAKE_PURE_VIRTUAL_METHOD(r, data, elem)
 
#define SILICIUM_DETAIL_MAKE_INTERFACE(name, typedefs, methods)
 
#define SILICIUM_DETAIL_ERASER_METHOD_ARGUMENT(z, n, text)   , BOOST_PP_CAT(_, n)
 
#define SILICIUM_DETAIL_MAKE_ERASER_METHOD(r, data, elem)
 
#define SILICIUM_DETAIL_MAKE_BOX_METHOD(r, data, elem)
 
#define SILICIUM_DETAIL_MAKE_ERASER(name, typedefs, methods)
 
#define SILICIUM_DETAIL_MAKE_BOX(name, typedefs, methods)
 
#define SILICIUM_SPECIALIZED_TRAIT(name, specialization, typedefs, methods)
 
#define SILICIUM_TRAIT(name, methods)   SILICIUM_SPECIALIZED_TRAIT(name, , , methods)
 
#define SILICIUM_TRAIT_WITH_TYPEDEFS(name, typedefs, methods)   SILICIUM_SPECIALIZED_TRAIT(name, , typedefs, methods)
 

Macro Definition Documentation

#define SILICIUM_DETAIL_ERASER_METHOD_ARGUMENT (   z,
  n,
  text 
)    , BOOST_PP_CAT(_, n)
#define SILICIUM_DETAIL_MAKE_BOX (   name,
  typedefs,
  methods 
)
Value:
struct box { \
typedefs \
std::unique_ptr<interface> original; \
SILICIUM_MOVABLE_MEMBER(name, original) \
explicit name(std::unique_ptr<interface> original) BOOST_NOEXCEPT : original(std::move(original)) {} \
BOOST_PP_SEQ_FOR_EACH(SILICIUM_DETAIL_MAKE_BOX_METHOD, _, methods) \
};
std::remove_reference< T >::type && move(T &&ref)
Definition: move.hpp:10
#define SILICIUM_MOVABLE_MEMBER(struct_name, member_name)
Definition: trait.hpp:16
#define SILICIUM_DETAIL_MAKE_BOX_METHOD(r, data, elem)
Definition: trait.hpp:53
#define SILICIUM_DETAIL_MAKE_BOX_METHOD (   r,
  data,
  elem 
)
Value:
BOOST_PP_TUPLE_ELEM(4, 2, elem) \
BOOST_PP_TUPLE_ELEM(4, 0, elem) \
SILICIUM_DETAIL_MAKE_PARAMETERS(BOOST_PP_TUPLE_ELEM(4, 1, elem)) \
BOOST_PP_TUPLE_ELEM(4, 3, elem) { \
assert(original); \
return original -> BOOST_PP_TUPLE_ELEM(4, 0, elem) ( \
BOOST_PP_ENUM_PARAMS(BOOST_PP_ARRAY_SIZE(BOOST_PP_TUPLE_ELEM(4, 1, elem)), arg) \
); \
}
#define SILICIUM_DETAIL_MAKE_PARAMETERS(array)
Definition: trait.hpp:23
#define SILICIUM_DETAIL_MAKE_ERASER (   name,
  typedefs,
  methods 
)
Value:
template <class Original> struct name : interface { \
typedefs \
Original original; \
SILICIUM_MOVABLE_MEMBER(name, original) \
explicit name(Original original) : original(std::move(original)) {} \
BOOST_PP_SEQ_FOR_EACH(SILICIUM_DETAIL_MAKE_ERASER_METHOD, _, methods) \
};
std::remove_reference< T >::type && move(T &&ref)
Definition: move.hpp:10
#define SILICIUM_MOVABLE_MEMBER(struct_name, member_name)
Definition: trait.hpp:16
Definition: absolute_path.hpp:352
#define SILICIUM_DETAIL_MAKE_ERASER_METHOD(r, data, elem)
Definition: trait.hpp:41
#define SILICIUM_DETAIL_MAKE_ERASER_METHOD (   r,
  data,
  elem 
)
Value:
virtual \
BOOST_PP_TUPLE_ELEM(4, 2, elem) \
BOOST_PP_TUPLE_ELEM(4, 0, elem) \
SILICIUM_DETAIL_MAKE_PARAMETERS(BOOST_PP_TUPLE_ELEM(4, 1, elem)) \
BOOST_PP_TUPLE_ELEM(4, 3, elem) \
return original. BOOST_PP_TUPLE_ELEM(4, 0, elem) ( \
BOOST_PP_ENUM_PARAMS(BOOST_PP_ARRAY_SIZE(BOOST_PP_TUPLE_ELEM(4, 1, elem)), arg) \
); \
}
#define SILICIUM_DETAIL_MAKE_PARAMETERS(array)
Definition: trait.hpp:23
#define SILICIUM_OVERRIDE
Definition: config.hpp:140
#define SILICIUM_DETAIL_MAKE_INTERFACE (   name,
  typedefs,
  methods 
)
Value:
struct name { \
virtual ~name() {} \
typedefs \
BOOST_PP_SEQ_FOR_EACH(SILICIUM_DETAIL_MAKE_PURE_VIRTUAL_METHOD, _, methods) \
};
#define SILICIUM_DETAIL_MAKE_PURE_VIRTUAL_METHOD(r, data, elem)
Definition: trait.hpp:25
#define SILICIUM_DETAIL_MAKE_PARAMETER (   z,
  n,
  array 
)    BOOST_PP_COMMA_IF(n) BOOST_PP_ARRAY_ELEM(n, array) BOOST_PP_CAT(arg, n)
#define SILICIUM_DETAIL_MAKE_PARAMETERS (   array)    ( BOOST_PP_REPEAT(BOOST_PP_ARRAY_SIZE(array), SILICIUM_DETAIL_MAKE_PARAMETER, array) )
#define SILICIUM_DETAIL_MAKE_PURE_VIRTUAL_METHOD (   r,
  data,
  elem 
)
Value:
virtual \
BOOST_PP_TUPLE_ELEM(4, 2, elem) \
BOOST_PP_TUPLE_ELEM(4, 0, elem) \
SILICIUM_DETAIL_MAKE_PARAMETERS(BOOST_PP_TUPLE_ELEM(4, 1, elem)) \
BOOST_PP_TUPLE_ELEM(4, 3, elem) \
= 0;
#define SILICIUM_DETAIL_MAKE_PARAMETERS(array)
Definition: trait.hpp:23
#define SILICIUM_MOVABLE_MEMBER (   struct_name,
  member_name 
)
Value:
struct_name() : member_name() BOOST_NOEXCEPT {} \
struct_name(struct_name &&other) BOOST_NOEXCEPT : member_name(std::move(other.member_name)) {} \
struct_name &operator = (struct_name &&other) BOOST_NOEXCEPT { member_name = std::move(other.member_name); return *this; }
std::remove_reference< T >::type && move(T &&ref)
Definition: move.hpp:10
Definition: absolute_path.hpp:352
#define SILICIUM_SPECIALIZED_TRAIT (   name,
  specialization,
  typedefs,
  methods 
)
Value:
struct name specialization { \
SILICIUM_DETAIL_MAKE_INTERFACE(interface, typedefs, methods) \
SILICIUM_DETAIL_MAKE_ERASER(eraser, typedefs, methods) \
SILICIUM_DETAIL_MAKE_BOX(box, typedefs, methods) \
template <class Original> \
static eraser<typename std::decay<Original>::type> erase(Original &&original) { \
return eraser<typename std::decay<Original>::type>{std::forward<Original>(original)}; \
} \
template <class Original> \
static box make_box(Original &&original) { \
return box{Si::to_unique(erase(std::forward<Original>(original)))}; \
} \
};
#define SILICIUM_DETAIL_MAKE_BOX(name, typedefs, methods)
Definition: trait.hpp:72
auto to_unique(T &&t) -> std::unique_ptr< typename std::decay< T >::type >
Definition: to_unique.hpp:10
#define SILICIUM_DETAIL_MAKE_ERASER(name, typedefs, methods)
Definition: trait.hpp:64
#define SILICIUM_DETAIL_MAKE_INTERFACE(name, typedefs, methods)
Definition: trait.hpp:33
#define SILICIUM_TRAIT (   name,
  methods 
)    SILICIUM_SPECIALIZED_TRAIT(name, , , methods)
#define SILICIUM_TRAIT_WITH_TYPEDEFS (   name,
  typedefs,
  methods 
)    SILICIUM_SPECIALIZED_TRAIT(name, , typedefs, methods)