MIRA
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Member Functions | List of all members
AbstractReflector< Derived > Class Template Reference

Abstract base class for most Reflectors. More...

#include <serialization/AbstractReflector.h>

Inheritance diagram for AbstractReflector< Derived >:
Inheritance graph
[legend]

Public Types

using VersionType = typename ReflectorInterface< Derived >::VersionType
 
using AcceptDesiredVersion = typename ReflectorInterface< Derived >::AcceptDesiredVersion
 
typedef boost::mpl::bool_< true > isReadOnly
 Specifies, if the Reflector is read-only (true) or write-only (false). More...
 
typedef boost::mpl::bool_< true > useHumanReadableIDs
 Specifies, if the Reflector supports human readable IDs. More...
 
typedef boost::mpl::bool_< false > requireReflectBarriers
 Specifies whether the Reflector uses so-called 'reflect barriers' to allow maintaining separate states for individual blocks of reflected data. More...
 

Public Member Functions

template<typename T >
VersionType requireVersion (VersionType version, VersionType minVersion, const T *caller=NULL)
 implements ReflectorInterface (for documentation see ReflectorInterface) More...
 
 MIRA_DEPRECATED ("Please call as requireVersion<MyType>(v, minV) or requireVersion(v, minV, this)", VersionType requireVersion(VersionType version, VersionType minVersion))
 
template<typename T >
void requireVersion (VersionType requiredVersion, const T *caller=NULL)
 implements ReflectorInterface (for documentation see ReflectorInterface) More...
 
 MIRA_DEPRECATED ("Please call as requireVersion<MyType>(v) or requireVersion(v, this)", void requireVersion(VersionType requiredVersion))
 
template<typename T >
VersionType requireVersion (VersionType version, VersionType minVersion, AcceptDesiredVersion, const T *caller=NULL)
 implements ReflectorInterface (for documentation see ReflectorInterface) More...
 
template<typename T >
void requireVersion (VersionType requiredVersion, AcceptDesiredVersion, const T *caller=NULL)
 implements ReflectorInterface (for documentation see ReflectorInterface) More...
 
template<typename Base >
void reflectBase (Base &base)
 implements ReflectorInterface (for documentation see ReflectorInterface) More...
 
ReflectState preReflect (const char *context="")
 If a reflector requires reflection barriers, preReflect() and postReflect() should be called before/after calling an external method within reflect(), to declare these barriers (such a 'barrier' is just a declaration to the reflector, in fact). More...
 
void postReflect (const ReflectState &)
 See preReflect for documentation. More...
 
Methods for reflecting members

These visiting methods are supported by the RecursiveMemberReflector.

template<typename T >
void member (const char *name, T &member, const char *comment, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Specifies a class member for reflection/serialization. More...
 
template<typename T >
void member (const char *name, const std::string &id, T &member, const char *comment, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, with an extra parameter for specifying the id explicitly if it differs from name. More...
 
template<typename T >
void member (const char *name, const T &member, Setter< T > setter, const char *comment, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, with a special setter method for reading the member. More...
 
template<typename T >
void member (const char *name, Getter< T > getter, Setter< T > setter, const char *comment, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, with a special getter and setter accessing the member. More...
 
template<typename T , typename U >
void member (const char *name, T &member, const char *comment, const U &defaultValue, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, where a default value can be specified that is used, if the value is not available in the data source. More...
 
template<typename T , typename U >
void member (const char *name, const T &member, Setter< T > setter, const char *comment, const U &defaultValue, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, where a default value can be specified that is used, if the value is not available in the data source. More...
 
template<typename T , typename U >
void member (const char *name, Getter< T > getter, Setter< T > setter, const char *comment, const U &defaultValue, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, where a default value can be specified that is used, if the value is not available in the data source. More...
 
template<typename T >
void property (const char *name, T &member, const char *comment, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime. More...
 
template<typename T >
void property (const char *name, const std::string &id, T &member, const char *comment, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, with an extra parameter for specifying the id explicitly if it differs from name. More...
 
template<typename T >
void property (const char *name, const T &member, Setter< T > setter, const char *comment, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime. More...
 
template<typename T >
void property (const char *name, Getter< T > getter, Setter< T > setter, const char *comment, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime. More...
 
template<typename T , typename U >
void property (const char *name, T &member, const char *comment, const U &defaultValue, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime. More...
 
template<typename T , typename U >
void property (const char *name, const T &member, Setter< T > setter, const char *comment, const U &defaultValue, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime. More...
 
template<typename T , typename U >
void property (const char *name, Getter< T > getter, Setter< T > setter, const char *comment, const U &defaultValue, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime. More...
 
template<typename T >
void roproperty (const char *name, const T &member, const char *comment, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 A property that just reflects a runtime state of the object and can be displayed but not altered. More...
 
template<typename T >
void roproperty (const char *name, const std::string &id, const T &member, const char *comment, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, with an extra parameter for specifying the id explicitly if it differs from name. More...
 
template<typename T >
void roproperty (const char *name, Getter< T > getter, const char *comment, PropertyHint &&hint=PropertyHint(), ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Same as above, with a special getter method for reading the member. More...
 
void itemName (const std::string &name)
 If the currently reflected object is an item within a collection, this allows to specify an explicit name for that item. More...
 
template<typename T >
void delegate (T &member, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Delegates the serialization/reflection of a member directly to the member. More...
 
template<typename T >
void delegate (const T &member, Setter< T > setter, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Delegates the serialization/reflection of a member directly to the member. More...
 
template<typename T >
void delegate (Getter< T > getter, Setter< T > setter, ReflectCtrlFlags flags=REFLECT_CTRLFLAG_NONE)
 Delegates the serialization/reflection of a member directly to the member. More...
 
Methods for reflecting RPC (remote procedure call) methods
void interface (const char *name)
 Indicates that the class implements the specified RPC interface. More...
 
template<typename R , typename... Args, typename F , typename... Description>
InvalidRPCDescription< R(Args...), Description... > method (const char *, F &&, Description &&...)
 
template<typename F , typename... Description>
InvalidRPCDescription< F, Description... > method (const char *, F &&, Description &&...)
 
template<typename R , typename Class , typename... Args, typename... Description>
InvalidRPCDescription< R(Class::*)(Args...), Description... > method (const char *, R(Class::*)(Args...), Class *, Description &&...)
 
template<typename R , typename Class , typename... Args, typename... Description>
InvalidRPCDescription< R(Class::*)(Args...) const, Description... > method (const char *, R(Class::*)(Args...) const, Class *, Description &&...)
 
template<typename R , typename... Args, typename F , typename... Description>
ValidRPCDescription< R(Args...), Description... > method (const char *, F &&, Description &&...)
 
template<typename F , typename... Description>
ValidRPCDescription< F, Description... > method (const char *, F &&, Description &&...)
 
template<typename R , typename Class , typename... Args, typename... Description>
ValidRPCDescription< R(Class::*)(Args...), Description... > method (const char *, R(Class::*)(Args...), Class *, Description &&...)
 
template<typename R , typename Class , typename... Args, typename... Description>
ValidRPCDescription< R(Class::*)(Args...) const, Description... > method (const char *, R(Class::*)(Args...) const, Class *, Description &&...)
 
void method (const char *name, Method method, const char *comment, const char *paramName, const char *paramDescription, P paramSampleValue,...)
 Specifies that the class that is reflected provides a service through the specified static member function or free function. More...
 
void method (const char *name, Method method, Class *object, const char *comment, const char *paramName, const char *paramDescription, P paramSampleValue,...)
 Specifies that the class that is reflected provides a service through the specified non-static member function. More...
 
void method (const char *name, Method method, const char *comment, const char *paramName, const char *paramDescription, P paramSampleValue,...)
 Specifies that the class that is reflected provides a service through the specified function wrapper. More...
 
template<typename R , typename ... Args>
void invalid_method ()
 
Controlling the object tracking state.
void pushObjectTrackingStore ()
 Push the current object tracking memory to an internal stack (backup). More...
 
void popObjectTrackingStore ()
 Pop the current object tracking memory from internal stack (restore). More...
 

Static Public Member Functions

static bool usesHumanReadableIDs ()
 Returns true, if the concrete derived Reflector supports human readable IDs. More...
 

Protected Member Functions

Derived * This ()
 "Curiously recurring template pattern" (CRTP). More...
 
template<typename T >
void invoke (T &object)
 Invokes this reflector on the specified object. More...
 
template<typename T >
void invokeOverwrite (T &object)
 The actual invoke implementation, that may also be overwritten in derived classes to add additional functionality. More...
 
template<typename T >
void reflectComplexIntrusive (T &object)
 For classes with reflect method call their reflect method directly. More...
 
template<typename T >
void reflectComplexNonintrusive (T &object)
 For classes without reflect method, where we need to look somewhere else to get the information for visiting it. More...
 
template<typename T >
void reflectMissing (T &object)
 

Static Protected Member Functions

static int checkForcedVersion (const std::string &variable)
 

Optional Class Versioning.

These visiting methods may be supported by different reflectors like the RecursiveMemberReflector and the RPCMethodReflector, etc.

Note
Specifying versions for serialized classes is optional.
requireVersion() and version() currently are supported by serialization reflectors only.
typedef serialization::ClassVersionMap ClassVersionMap
 
template<typename T >
VersionType version (VersionType version, const T *caller=NULL)
 Specifies the current class version and returns the version found in the data stream. More...
 
template<typename T >
VersionType version (VersionType version, AcceptDesiredVersion, const T *caller=NULL)
 Extension of version() (see above), that additionally signals the reflector that the caller will properly handle a different version than the one it specifies itself. More...
 
 MIRA_DEPRECATED ("Please call as version<MyType>(v) or version(v, this)", VersionType version(VersionType version))
 Deprecated 'anonymous' (no type) version(). More...
 
 MIRA_DEPRECATED ("Please call as requireVersion<MyType>(v, minV) or requireVersion(v, minV, this)", VersionType requireVersion(VersionType version, VersionType minVersion))
 Deprecated 'anonymous' (no type) requireVersion(). More...
 
 MIRA_DEPRECATED ("Please call as requireVersion<MyType>(v) or requireVersion(v, this)", VersionType requireVersion(VersionType version))
 Deprecated 'anonymous' (no type) requireVersion(). More...
 
template<typename T >
VersionType requireVersion (VersionType version, VersionType minVersion, const T *caller=NULL)
 Same as above, but allows to specify a minimum supported version, and throws XIO if the minimum version requirement is not met. More...
 
template<typename T >
void requireVersion (VersionType version, const T *caller=NULL)
 Specifies the current class version, which is also the minimum (and therefore only) version accepted (therefore, no need to return a version number). More...
 
template<typename T >
VersionType requireVersion (VersionType version, VersionType minVersion, AcceptDesiredVersion, const T *caller=NULL)
 Extension of requireVersion() (see above), that additionally signals the reflector that the caller will properly handle a different version than the one it specifies itself. More...
 
template<typename T >
void requireVersion (VersionType version, AcceptDesiredVersion, const T *caller=NULL)
 Extension of requireVersion() (see above), that additionally signals the reflector that the caller will properly handle a different version than it one it specifies itself. More...
 
void desireClassVersions (const ClassVersionMap &versions)
 Historically, classes have just been defining their current version themselves during serialization (the case where an object exists and its state is read out and serialized), by calling Reflector::version() with the respective version number parameter. More...
 

Detailed Description

template<typename Derived>
class mira::AbstractReflector< Derived >

Abstract base class for most Reflectors.

This class implements the reflectBase() method of the ReflectorInterface. It additionally provides the This() method for the "Curiously recurring template pattern" (CRTP) to achieve static polymorphism at compile time.

Moreover, the AbstractReflector implements the invoke() method which invokes the Reflector on an object of a certain class by calling the class' reflect method. If the class does not contain such an intrusive reflect method, the non-intrusive reflect method, that must be defined outside of the class within the same namespace or in the global namespace, will be used.

Derived Reflectors can overwrite the invokeOverwrite() method. invokeOverwrite() is called directly from invoke() and ensures that the invokeOverwrite() of the most derived class is called (some kind of static virtual function call without performance penalty, see CRTP). If a Reflector overwrites invokeOverwrite() it should always call invokeOverwrite() of this base class.

Beside the invoke() method a Reflector may be passed as parameter when calling a reflect method directly. However, you usually should use the invoke() method to ensure, that invokeOverwrite() method of the derived classes is called.

However, usually the final Reflectors that are used by the "end-user" like the Serializer and Deserializer provide their own special methods (e.g. serialize, deserialize, ...) for invoking the Reflector. For those Reflectors these methods must be called, instead of the invoke() method. These Reflectors will call invoke(), internally. See the documentation of the concrete derived Reflectors for more details. For this reason the invoke() method of the AbstractReflector is protected. The derived concrete Reflectors may expose the method or provide their own public interface (as Serializer and Deserializer do).

Implements from base classes: reflectBase()

Methods that can be overwritten: invokeOverwrite()

Implementation Detail:

This class and derived classes uses the Curiously recurring template pattern (CRTP) to implement static polymorphism. To do so, each class that derives from ReflectorInterface or any derived class gives its own type as template parameter, e.g.

class MyClass : public ReflectorInterface<MyClass>

Hence, the ReflectorInterface and derived classes know about their concrete derived class (that is MyClass in the above example). The This()-method then can safely cast the this pointer into the concrete derived type. Therefore, the Reflector and all derived classes can call methods of the final derived concrete class using This()->method();

See Wikipedia for more details!

Implementation Detail:

See also
Serialization

Member Typedef Documentation

◆ VersionType

using VersionType = typename ReflectorInterface<Derived>::VersionType

◆ AcceptDesiredVersion

◆ isReadOnly

typedef boost::mpl::bool_<true> isReadOnly
inherited

Specifies, if the Reflector is read-only (true) or write-only (false).

This type must be set to the proper boost::mpl::bool type by the derived Reflector class. (Default is true)

◆ useHumanReadableIDs

typedef boost::mpl::bool_<true> useHumanReadableIDs
inherited

Specifies, if the Reflector supports human readable IDs.

This type must be set to the proper boost::mpl::bool type by the derived Reflector class. (Default is true)

◆ requireReflectBarriers

typedef boost::mpl::bool_<false> requireReflectBarriers
inherited

Specifies whether the Reflector uses so-called 'reflect barriers' to allow maintaining separate states for individual blocks of reflected data.

A reflect barrier is just a virtual separation line declared by a reflected object. It tells the reflector that certain parts of the reflected data should be considered as independent and can have separate states (if the reflector maintains any states for data). As an example, the BinarySerializer reserves space for a version number for each reflected object. If there is more than one individual block, it reserves space for a version for each of the blocks. If the reflector needs reflect barriers, it defines requireReflectBarriers::type to true in its class scope, and defines methods preReflect() and postReflect() that should be called by reflected objects for separation of independent reflection blocks (where the separation is not already implied by visitors like reflector.member()!) (The default is false). Also see ReflectState and MIRA_REFLECT_CALL.

◆ ClassVersionMap

Member Function Documentation

◆ requireVersion() [1/8]

VersionType requireVersion ( VersionType  version,
VersionType  minVersion,
const T *  caller = NULL 
)
inline

implements ReflectorInterface (for documentation see ReflectorInterface)

◆ MIRA_DEPRECATED() [1/5]

MIRA_DEPRECATED ( "Please call as requireVersion<MyType>(v, minV) or requireVersion(v, minV, this)"  ,
VersionType   requireVersionVersionType version, VersionType minVersion 
)
inline

◆ requireVersion() [2/8]

void requireVersion ( VersionType  requiredVersion,
const T *  caller = NULL 
)
inline

implements ReflectorInterface (for documentation see ReflectorInterface)

◆ MIRA_DEPRECATED() [2/5]

MIRA_DEPRECATED ( "Please call as requireVersion<MyType>(v) or requireVersion(v, this)"  ,
void   requireVersionVersionType requiredVersion 
)
inline

◆ requireVersion() [3/8]

VersionType requireVersion ( VersionType  version,
VersionType  minVersion,
AcceptDesiredVersion  ,
const T *  caller = NULL 
)
inline

implements ReflectorInterface (for documentation see ReflectorInterface)

◆ requireVersion() [4/8]

void requireVersion ( VersionType  requiredVersion,
AcceptDesiredVersion  ,
const T *  caller = NULL 
)
inline

implements ReflectorInterface (for documentation see ReflectorInterface)

◆ reflectBase()

void reflectBase ( Base &  base)
inline

implements ReflectorInterface (for documentation see ReflectorInterface)

◆ This()

Derived* This ( )
inlineprotected

"Curiously recurring template pattern" (CRTP).

Safely casts this into Derived. This is safe since when implementing derived class their type is passed as template parameter.

See Wikipedia for more details on CRTP if necessary!

◆ invoke()

void invoke ( T &  object)
inlineprotected

Invokes this reflector on the specified object.

This is like calling object.reflect(*this). However, this automatically examines if the class T contains a reflect method. In this case it calls the intrusive reflect method, otherwise it uses the non-intrusive reflect method.

◆ invokeOverwrite()

void invokeOverwrite ( T &  object)
inlineprotected

The actual invoke implementation, that may also be overwritten in derived classes to add additional functionality.

Note
If you overwrite this method you should call the implementation of the base class unless you perform your own invocation process.

◆ reflectComplexIntrusive()

void reflectComplexIntrusive ( T &  object)
inlineprotected

For classes with reflect method call their reflect method directly.

◆ reflectComplexNonintrusive()

void reflectComplexNonintrusive ( T &  object)
inlineprotected

For classes without reflect method, where we need to look somewhere else to get the information for visiting it.

To do so we call a global non-intrusive reflect-function which must be specialized for the visitor and the member type. This allows non-intrusive reflection. If the non-intrusive reflect method does not exist we will get a compiler error here!

◆ reflectMissing()

void reflectMissing ( T &  object)
inlineprotected

◆ version() [1/2]

VersionType version ( VersionType  version,
const T *  caller = NULL 
)
inlineinherited

Specifies the current class version and returns the version found in the data stream.

During serialization (read-only reflector), the specified version usually is stored as class version in the data stream. However, the serialized version can be overridden by setting a specific version for a certain class identifier, using desireClassVersions(). In that case, version() may return a different value than specified, and the class' reflect() method must implement reflection according to that version number. During deserialization (write-only reflector), the reflector reads the version found in the data stream and returns it. Providing the type of the caller enables defining separate version numbers for all base classes of an inherited type. Each class in the inheritance hierarchy can store and retrieve a version number independently of all its bases or sub-classes (assuming reflect() calls the reflect() method of the base class using reflectBase()). The type of the caller is also required to look up whether a specific version is desired (see desireClassVersions()). The sole purpose of the 'caller' parameter is to enable automatic deduction of the template parameter T. It can be omitted when T is given explicitly.

Usage:

template<typename Reflector>
void reflect(Reflector& r)
{
VersionType v = r.version(3, this); // specifies current version 3
// in serialization case, normally returns v=3, unless
// configured differently using desireClassVersions()
// in deserialization case, returns the version read from serialized data
// (or throws XIO if that is higher than 3, i.e. incompatible)
r.member("X", x, "");
if (version >= 2)
r.member("X2", x2, "");
if (version == 3)
...
}
Note
Specifying versions for serialized classes is optional.
requireVersion() and version() currently are supported by serialization reflectors only

◆ version() [2/2]

VersionType version ( VersionType  version,
AcceptDesiredVersion  ,
const T *  caller = NULL 
)
inlineinherited

Extension of version() (see above), that additionally signals the reflector that the caller will properly handle a different version than the one it specifies itself.

◆ MIRA_DEPRECATED() [3/5]

MIRA_DEPRECATED ( "Please call as version<MyType>(v) or version(v, this)"  ,
VersionType   versionVersionType version 
)
inlineinherited

Deprecated 'anonymous' (no type) version().

◆ MIRA_DEPRECATED() [4/5]

MIRA_DEPRECATED ( "Please call as requireVersion<MyType>(v, minV) or requireVersion(v, minV, this)"  ,
VersionType   requireVersionVersionType version, VersionType minVersion 
)
inlineinherited

Deprecated 'anonymous' (no type) requireVersion().

◆ MIRA_DEPRECATED() [5/5]

MIRA_DEPRECATED ( "Please call as requireVersion<MyType>(v) or requireVersion(v, this)"  ,
VersionType   requireVersionVersionType version 
)
inlineinherited

Deprecated 'anonymous' (no type) requireVersion().

◆ requireVersion() [5/8]

VersionType requireVersion ( VersionType  version,
VersionType  minVersion,
const T *  caller = NULL 
)
inlineinherited

Same as above, but allows to specify a minimum supported version, and throws XIO if the minimum version requirement is not met.

Calls version() internally.

Usage:

template<typename Reflector>
void reflect(Reflector& r)
{
VersionType v = r.requireVersion(4, 2, this); // specifies version 4,
// requires version 2 or higher
if(v==3) { // handle reading version 3
...
} else // only versions 2 or 4 remain
...
}
Note
Specifying versions for serialized classes is optional.
requireVersion() and version() currently are supported by serialization reflectors only

◆ requireVersion() [6/8]

void requireVersion ( VersionType  version,
const T *  caller = NULL 
)
inlineinherited

Specifies the current class version, which is also the minimum (and therefore only) version accepted (therefore, no need to return a version number).

See above.

◆ requireVersion() [7/8]

VersionType requireVersion ( VersionType  version,
VersionType  minVersion,
AcceptDesiredVersion  ,
const T *  caller = NULL 
)
inlineinherited

Extension of requireVersion() (see above), that additionally signals the reflector that the caller will properly handle a different version than the one it specifies itself.

◆ requireVersion() [8/8]

void requireVersion ( VersionType  version,
AcceptDesiredVersion  ,
const T *  caller = NULL 
)
inlineinherited

Extension of requireVersion() (see above), that additionally signals the reflector that the caller will properly handle a different version than it one it specifies itself.

◆ desireClassVersions()

void desireClassVersions ( const ClassVersionMap versions)
inlineinherited

Historically, classes have just been defining their current version themselves during serialization (the case where an object exists and its state is read out and serialized), by calling Reflector::version() with the respective version number parameter.

Different versions of a class were only considered during deserialization (i.e. restoring an object state from serialized data). In some cases it may be desirable, however, to serialize a different version (naturally, this can not be a higher version than the class implementation knows, only lower). This is useful e.g. to ensure serializing data that is compatible with a certain other (older) implementation, thus it can be deserialized by another instance.

For such cases, a mechanism is provided to generally enable requesting a specific version for any class from the reflector. This involves providing a map of class types (type names) to version numbers to the reflector. When a class contained in the map calls version() in its reflect() method, the call shall return the version number from the version map instead of the version number indicated by the class implementation itself. The class serialization must then follow that returned version.

A call to this method will always overwrite any previous setting of desired versions, i.e. the map is not cumulative.

Note
Since this is an addition to the ReflectorInterface in MIRABase 1.9.0, it cannot be ensured that all existing classes supported by the MIRA serialization framework (i.e., all classes for which exists an intrusive or non-intrusive reflect() method) properly support this mechanism of external version selection for serialization. In order to allow the reflector to be sure the class understands and observes a different version returned to it (or otherwise make the reflector refrain from changing the version indicated by the class and issue a warning instead), variants of the above version()/requireVersion() methods are introduced which implicitly provide that confirmation when called. See below.

◆ member() [1/7]

void member ( const char *  name,
T &  member,
const char *  comment,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Specifies a class member for reflection/serialization.

For each member its name (as used in XML files, etc) and a comment that describes the member must be specified.

Parameters
nameThe name of the member (as used in XML files)
memberThe member that should be reflected/serialized
commentA comment that describes the member
flagsFlags for controlling the reflection

◆ member() [2/7]

void member ( const char *  name,
const std::string &  id,
T &  member,
const char *  comment,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, with an extra parameter for specifying the id explicitly if it differs from name.

(Used by several adapters to STL-containers, etc.)

◆ member() [3/7]

void member ( const char *  name,
const T &  member,
Setter< T >  setter,
const char *  comment,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, with a special setter method for reading the member.

See also
Getters and Setters

◆ member() [4/7]

void member ( const char *  name,
Getter< T >  getter,
Setter< T >  setter,
const char *  comment,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, with a special getter and setter accessing the member.

Since both, getter and setter are specified, the member does not need to be specified itself. The full access is done using the accessor methods.

See also
Getters and Setters

◆ member() [5/7]

void member ( const char *  name,
T &  member,
const char *  comment,
const U &  defaultValue,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, where a default value can be specified that is used, if the value is not available in the data source.

See also
Default Values

◆ member() [6/7]

void member ( const char *  name,
const T &  member,
Setter< T >  setter,
const char *  comment,
const U &  defaultValue,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, where a default value can be specified that is used, if the value is not available in the data source.

See also
Default Values

◆ member() [7/7]

void member ( const char *  name,
Getter< T >  getter,
Setter< T >  setter,
const char *  comment,
const U &  defaultValue,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, where a default value can be specified that is used, if the value is not available in the data source.

See also
Default Values

◆ property() [1/7]

void property ( const char *  name,
T &  member,
const char *  comment,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime.

Using the last optional parameter certain "property hints" can be specified

◆ property() [2/7]

void property ( const char *  name,
const std::string &  id,
T &  member,
const char *  comment,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, with an extra parameter for specifying the id explicitly if it differs from name.

(Used by several adapters to STL-containers, etc.)

◆ property() [3/7]

void property ( const char *  name,
const T &  member,
Setter< T >  setter,
const char *  comment,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime.

◆ property() [4/7]

void property ( const char *  name,
Getter< T >  getter,
Setter< T >  setter,
const char *  comment,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime.

◆ property() [5/7]

void property ( const char *  name,
T &  member,
const char *  comment,
const U &  defaultValue,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime.

◆ property() [6/7]

void property ( const char *  name,
const T &  member,
Setter< T >  setter,
const char *  comment,
const U &  defaultValue,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime.

◆ property() [7/7]

void property ( const char *  name,
Getter< T >  getter,
Setter< T >  setter,
const char *  comment,
const U &  defaultValue,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as the corresponding member-method, to indicate that the member is a property and can be altered at runtime.

◆ roproperty() [1/3]

void roproperty ( const char *  name,
const T &  member,
const char *  comment,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

A property that just reflects a runtime state of the object and can be displayed but not altered.

◆ roproperty() [2/3]

void roproperty ( const char *  name,
const std::string &  id,
const T &  member,
const char *  comment,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, with an extra parameter for specifying the id explicitly if it differs from name.

◆ roproperty() [3/3]

void roproperty ( const char *  name,
Getter< T >  getter,
const char *  comment,
PropertyHint &&  hint = PropertyHint(),
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Same as above, with a special getter method for reading the member.

See also
Getters and Setters

◆ itemName()

void itemName ( const std::string &  name)
inlineinherited

If the currently reflected object is an item within a collection, this allows to specify an explicit name for that item.

This currently is interpreted by the PropertySerializer only.

◆ delegate() [1/3]

void delegate ( T &  member,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Delegates the serialization/reflection of a member directly to the member.

Must be used with IsTransparentSerializable and is for most advanced users only.

◆ delegate() [2/3]

void delegate ( const T &  member,
Setter< T >  setter,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Delegates the serialization/reflection of a member directly to the member.

Must be used with IsTransparentSerializable and is for most advanced users only.

◆ delegate() [3/3]

void delegate ( Getter< T >  getter,
Setter< T >  setter,
ReflectCtrlFlags  flags = REFLECT_CTRLFLAG_NONE 
)
inlineinherited

Delegates the serialization/reflection of a member directly to the member.

Must be used with IsTransparentSerializable and is for most advanced users only.

◆ interface()

void interface ( const char *  name)
inlineinherited

Indicates that the class implements the specified RPC interface.

If you indicate that your class implements the specified interface by calling this method in your reflect method, there is an implicit contract that your class provides all methods that are defined by that interface.

◆ method() [1/11]

InvalidRPCDescription<R(Args...), Description...> method ( const char *  ,
F &&  ,
Description &&  ... 
)
inlineinherited

◆ method() [2/11]

InvalidRPCDescription<F, Description...> method ( const char *  ,
F &&  ,
Description &&  ... 
)
inlineinherited

◆ method() [3/11]

InvalidRPCDescription<R (Class::*)(Args...), Description...> method ( const char *  ,
R(Class::*)(Args...)  ,
Class ,
Description &&  ... 
)
inlineinherited

◆ method() [4/11]

InvalidRPCDescription<R (Class::*)(Args...) const, Description...> method ( const char *  ,
R(Class::*)(Args...)  const,
Class ,
Description &&  ... 
)
inlineinherited

◆ method() [5/11]

ValidRPCDescription<R(Args...), Description...> method ( const char *  ,
F &&  ,
Description &&  ... 
)
inlineinherited

◆ method() [6/11]

ValidRPCDescription<F, Description...> method ( const char *  ,
F &&  ,
Description &&  ... 
)
inlineinherited

◆ method() [7/11]

ValidRPCDescription<R (Class::*)(Args...), Description...> method ( const char *  ,
R(Class::*)(Args...)  ,
Class ,
Description &&  ... 
)
inlineinherited

◆ method() [8/11]

ValidRPCDescription<R (Class::*)(Args...) const, Description...> method ( const char *  ,
R(Class::*)(Args...)  const,
Class ,
Description &&  ... 
)
inlineinherited

◆ method() [9/11]

void method ( const char *  name,
Method  method,
const char *  comment,
const char *  paramName,
const char *  paramDescription,
paramSampleValue,
  ... 
)
inherited

Specifies that the class that is reflected provides a service through the specified static member function or free function.

The method will then be available for RPC calls. For each method its name (used to identify the method in RPC calls) and a comment that describes the method must be specified.

Parameters
nameThe name of the method (used for calling it)
methodThe static member function (or free function) that implements the method
commentA comment that describes the method
paramNameOptional additional argument(s) for the names of the method's parameters
paramDescriptionOptional additional argument(s) for the descriptions of the method's parameters.
paramSampleValueOptional additional argument(s) providing a sample value for each parameter. These are not default values, they are only used for documentation purpose, and should mainly serve to illustrate notation.

The optional parameter documentation arguments must be either a sequence of pairs of const char* values or a sequence of triplets, where each third value is a value of the respective method parameter's type. (name and description must both be provided, for all parameters or for none, and if sample values are to be added, they also need to be added for all parameters).

Examples:

r.method("myMethod1", myStaticMethod1, "static method that does something");
r.method("myMethod2", myStaticMethod2, "static method that does something else",
"x", "1st parameter", "y", "2nd parameter");
r.method("myMethod3", myStaticMethod3, "yet another static method"
"a", "parameter 1", ParamType1(...), "b", "parameter b", ParamType2(...));

◆ method() [10/11]

void method ( const char *  name,
Method  method,
Class object,
const char *  comment,
const char *  paramName,
const char *  paramDescription,
paramSampleValue,
  ... 
)
inherited

Specifies that the class that is reflected provides a service through the specified non-static member function.

The method will then be available for RPC calls. For each method its name (used to identify the method in RPC calls) and a comment that describes the method must be specified.

Parameters
nameThe name of the method (used for calling it)
methodThe non-static member function (const or non-const) that implements the method
objectA pointer to the object on which the function is called (usually "this")
commentA comment that describes the method
paramNameOptional additional argument(s) for the names of the method's parameters
paramDescriptionOptional additional argument(s) for the descriptions of the method's parameters.
paramSampleValueOptional additional argument(s) providing a sample value for each parameter.

See above for documentation of optional parameter documentation arguments.

Example:

r.method("myMethod2", &MyClass::myMethod, this, "a non-static method");

◆ method() [11/11]

void method ( const char *  name,
Method  method,
const char *  comment,
const char *  paramName,
const char *  paramDescription,
paramSampleValue,
  ... 
)
inherited

Specifies that the class that is reflected provides a service through the specified function wrapper.

The method will then be available for RPC calls. For each method its name (used to identify the method in RPC calls) and a comment that describes the method must be specified.

Parameters
nameThe name of the method (used for calling it)
methodThe function wrapper object that implements the method, e.g. created using boost::bind
commentA comment that describes the method
paramNameOptional additional argument(s) for the names of the method's parameters
paramDescriptionOptional additional argument(s) for the descriptions of the method's parameters.
paramSampleValueOptional additional argument(s) providing a sample value for each parameter.

See above for documentation of optional parameter documentation arguments.

Example:

r.method("myMethod3", boost::bind(&MyClass::myMethod, this, 1.23, 4, _1), "a function wrapper");

◆ invalid_method()

void invalid_method ( )
inlineinherited

◆ pushObjectTrackingStore()

void pushObjectTrackingStore ( )
inlineinherited

Push the current object tracking memory to an internal stack (backup).

◆ popObjectTrackingStore()

void popObjectTrackingStore ( )
inlineinherited

Pop the current object tracking memory from internal stack (restore).

◆ usesHumanReadableIDs()

static bool usesHumanReadableIDs ( )
inlinestaticinherited

Returns true, if the concrete derived Reflector supports human readable IDs.

The return value of this method is known at compile time and hence the compiler is able to optimize the code depending on that value.

◆ preReflect()

ReflectState preReflect ( const char *  context = "")
inlineinherited

If a reflector requires reflection barriers, preReflect() and postReflect() should be called before/after calling an external method within reflect(), to declare these barriers (such a 'barrier' is just a declaration to the reflector, in fact).

The base implementation is empty and should not actually be called (if a reflector needs these methods, it must provide own definitions).

Parameters
contextCan be used to provide context, e.g. name of the reflected class or function that is called. How this is used depends on the reflector implementation, e.g. MetaSerializer uses it to generate comments on data elements implicitly defined by preReflect.

The complete process of calling these methods is wrapped by MIRA_REFLECT_CALL. That macro should be used to simplify handling.

See requireReflectBarriers and ReflectState.

◆ postReflect()

void postReflect ( const ReflectState )
inlineinherited

See preReflect for documentation.

◆ checkForcedVersion()

static int checkForcedVersion ( const std::string &  variable)
inlinestaticprotectedinherited

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