|
µSer
|
Main header file for the µSer Serialization library. More...
#include <cstddef>#include <array>#include <type_traits>#include <utility>#include <cassert>#include <iterator>#include <tuple>#include <cstdint>#include <limits>#include <memory>#include <ostream>#include <iomanip>Classes | |
| struct | uSer::ByteOrder::LE |
| Attribute: Store an integer as Little Endian. More... | |
| struct | uSer::ByteOrder::BE |
| Attribute: Store an integer as Big Endian. More... | |
| struct | uSer::ByteOrder::PDP |
| Attribute: Store an integer as PDP-Endian. More... | |
| struct | uSer::SignFormat::TwosComplement |
| Attribute: Store a signed integer in Two's Complement format. More... | |
| struct | uSer::SignFormat::SignedMagnitude |
| Attribute: Store a signed integer in Signed-Magnitude format. More... | |
| struct | uSer::SignFormat::OnesComplement |
| Attribute: Store a signed integer in One's Complement format. More... | |
| struct | uSer::Padding::None |
| Attribute: Store no padding bits after the actual bits of an integer. This is the default. Can only be applied to integers. More... | |
| struct | uSer::Padding::Fixed< Count > |
| Attribute: Store a fixed number of padding bits after the actual bits of an integer. Can only be applied to integers. More... | |
| struct | uSer::Dyn::Size< Ref > |
| An attribute that defines the size of a container that is a member of a struct to depend on external data, typically previously deserialized. More... | |
| struct | uSer::Dyn::Optional< Ref > |
| An attribute that decides whether a member of a struct is (de)serialized at all depending on external data, typically previously deserialized. More... | |
| struct | uSer::Hook::SerPre< Ref > |
| Attribute: Define a function to be called before the object (which can but need not be a struct member) is serialized. More... | |
| struct | uSer::Hook::DeSerPre< Ref > |
| Attribute: Define a function to be called before the object (which can but need not be a struct member) is deserialized. More... | |
| struct | uSer::Hook::SerPost< Ref > |
| Attribute: Define a function to be called after the object (which can but need not be a struct member) is serialized. More... | |
| struct | uSer::Hook::DeSerPost< Ref > |
| Attribute: Define a function to be called after the object (which can but need not be a struct member) is deserialized. More... | |
| struct | uSer::Width< W > |
| Attribute: Define the serialized size of an integer type. May not be larger than the C(++) data type used. More... | |
| struct | uSer::RawInfo< SWord_, wSize_ > |
| Attribute: Declares the serialization word explicitly. More... | |
| struct | uSer::StructMembers< MemPtrs > |
| Define the members of a struct by providing member pointers. More... | |
| struct | uSer::Unlimited |
| Indicates a dynamic data structure whose maximum serialized size can not be pre-calculated (e.g. when containers are used) More... | |
| struct | uSer::MaxSize< N > |
| Indicates a fixed maximum size for a dynamic data structure. More... | |
| struct | uSer::NoDyn |
| Indicates a data structure with no dynamic data. More... | |
| struct | uSer::FixedSize< Size > |
| struct | uSer::DynSize |
| struct | uSer::InfSize |
| class | uSer::Exception |
Namespaces | |
| uSerExtAnnot | |
| Namespace that collects external annotations. Contents is generated via the USER_EXT_ANNOT macros. | |
| uSer | |
| µSer main API. | |
| uSer::ByteOrder | |
| Byte orders for integers in serialized data. | |
| uSer::SignFormat | |
| Formats for signed integers. | |
| uSer::Hook | |
| Attributes to define hook functions for uSer. | |
Macros | |
| #define | USER_STRUCT(name, ...) using uSer_Self = name; using uSer_Attributes = ::uSer::DefAttr<__VA_ARGS__>; |
| Begin intrusive struct definition. More... | |
| #define | USER_MEM_ANNOT(name, ...) static ::uSer::DefAttr<__VA_ARGS__> uSer_MemAttributes (::uSer::Helper::VTag<&uSer_Self:: name >); |
| Define attributes for single struct member. More... | |
| #define | USER_ENUM_MEM(...) using uSer_Members = ::uSer::StructMembers<USER_PPM_MAP_LIST(USER_ENUM_MEMPTR,uSer_Self,__VA_ARGS__)>; |
| List previously defined struct members. More... | |
| #define | USER_MEM(type, name, ...) type name; USER_MEM_ANNOT(name, __VA_ARGS__) |
| Define and annotate struct member. More... | |
| #define | USER_DEF_MEM(...) USER_PPM_MAP(USER_DEF_MEM_I,,__VA_ARGS__) using uSer_Members = ::uSer::StructMembers<USER_PPM_MAP_LIST(USER_DEF_MEM_GET_MPTR,uSer_Self,__VA_ARGS__)>; |
| Define and annotate multiple struct members with attributes in one step. See Defining and annotating all struct members in one step. More... | |
| #define | USER_EXT_ANNOT(name, ...) namespace uSerExtAnnot { template <> struct ExtAttr<name> { using Type = ::uSer::DefAttr<__VA_ARGS__>; }; } |
| Annotate external data type (struct) More... | |
| #define | USER_EXT_MEM_ANNOT(sname, name, ...) namespace uSerExtAnnot { template <> struct ExtMemAttr<&sname :: name> { using Type = ::uSer::DefAttr<__VA_ARGS__>; }; } |
| Annotate external struct member. More... | |
| #define | USER_EXT_ENUM_MEM(sname, ...) namespace uSerExtAnnot { template <> struct ExtStructMembers<sname> { using Type = ::uSer::StructMembers<USER_PPM_MAP_LIST(USER_ENUM_MEMPTR,sname,__VA_ARGS__)>; }; } |
| List external struct members. More... | |
| #define | USER_EXT_DEF_MEM(sname, ...) USER_PPM_MAP(USER_EXT_ENUM_MEM_I,sname,__VA_ARGS__) namespace uSerExtAnnot { template <> struct ExtStructMembers <sname>{ using Type = ::uSer::StructMembers<USER_PPM_MAP_LIST(USER_EXT_ENUM_MEM_GET_MPTR,sname,__VA_ARGS__)>; }; } |
| Define and annotate multiple members of any external struct with attributes in one step. This macro must be called in the global namespace. See Non-Intrusive struct annotation. More... | |
| #define | USER_EXTERN_C extern "C" |
| This macro evaluates to extern "C" from C++, and to nothing in C. It can be used to define C++ functions that can be called from C code. | |
Typedefs | |
| using | uSer::AttrNone = Attributes<> |
| using | uSer::ByteOrder::Native = LE |
| This alias only exists if the compiler provides a BYTE_ORDER macro. It is an alias for LE, BE or PDP depending on the host byte order. | |
| template<typename RawIter , typename Obj , typename... Attr> | |
| using | uSer::RawMaxDynamic = typename decltype(SWalk::walk(GetSerAlgo< true, RawIter, Attr... >::template root< Obj, InfSize, Helper::GetRootAttr< Attr... >>(std::declval< RawIter >(), std::declval< Obj & >(), infSize), Helper::GetRootAttr< Attr... >{}))::MaxDyn |
| Indicates the maximum number of dynamic serialization words in raw data; may be an alias to Unlimited, NoDyn, or MaxSize. | |
Enumerations |
Functions | |
| const char * | uSer_getErrorMessage (uSer_ErrorCode ec) |
| Returns a string describing the error indicated by the given error code. | |
| template<typename... Attr, typename RawIter , typename Obj , typename SizeT , std::enable_if_t< std::is_convertible_v< SizeT, Helper::SizeDefTag >, int > = 42> | |
| decltype(auto) | uSer::serialize (RawIter &&raw, const Obj &obj, SizeT size, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename SWord , typename Obj , std::size_t N> | |
| decltype(auto) | uSer::serialize (SWord(&raw)[N], const Obj &obj, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename SWord , typename Obj , std::size_t N> | |
| decltype(auto) | uSer::serialize (std::array< SWord, N > &raw, const Obj &obj, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename RawIter , typename Obj > | |
| decltype(auto) | uSer::serialize (RawIter &&raw, const Obj &obj, std::size_t size, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename RawContainer , typename Obj , decltype(std::size(std::declval< RawContainer >()))* = nullptr> | |
| decltype(auto) | uSer::serialize (RawContainer &&raw, const Obj &obj, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename RawIter , typename Obj , typename SizeT , std::enable_if_t< std::is_convertible_v< SizeT, Helper::SizeDefTag >, int > = 42> | |
| decltype(auto) | uSer::deserialize (RawIter &&raw, Obj &obj, SizeT size, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename SWord , typename Obj , std::size_t N> | |
| decltype(auto) | uSer::deserialize (const SWord(&raw)[N], Obj &obj, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename SWord , typename Obj , std::size_t N> | |
| decltype(auto) | uSer::deserialize (const std::array< SWord, N > &raw, Obj &obj, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename SWord , typename Obj , std::size_t N> | |
| decltype(auto) | uSer::deserialize (SWord(&raw)[N], Obj &obj, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename SWord , typename Obj , std::size_t N> | |
| decltype(auto) | uSer::deserialize (std::array< SWord, N > &raw, Obj &obj, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename RawIter , typename Obj > | |
| decltype(auto) | uSer::deserialize (RawIter &&raw, Obj &obj, std::size_t size, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename RawContainer , typename Obj , decltype(std::size(std::declval< RawContainer >()))* = nullptr> | |
| decltype(auto) | uSer::deserialize (RawContainer &&raw, Obj &obj, std::size_t *sizeUsed=nullptr) |
| template<typename... Attr, typename Obj > | |
| constexpr bool | uSer::compare (const Obj &a, const Obj &b) |
| template<typename... Attr, typename Obj > | |
| std::ostream & | uSer::print (std::ostream &os, const Obj &obj) |
Main header file for the µSer Serialization library.
| #define USER_DEF_MEM | ( | ... | ) | USER_PPM_MAP(USER_DEF_MEM_I,,__VA_ARGS__) using uSer_Members = ::uSer::StructMembers<USER_PPM_MAP_LIST(USER_DEF_MEM_GET_MPTR,uSer_Self,__VA_ARGS__)>; |
Define and annotate multiple struct members with attributes in one step. See Defining and annotating all struct members in one step.
| ... | A sequence of the form (type1,name1,attributes1...),(type2,name2,attributes2...), ... |
| #define USER_ENUM_MEM | ( | ... | ) | using uSer_Members = ::uSer::StructMembers<USER_PPM_MAP_LIST(USER_ENUM_MEMPTR,uSer_Self,__VA_ARGS__)>; |
List previously defined struct members.
Call this macro after USER_STRUCT and the definition of member variables to make the members known to µSer. See Defining and annotating struct members separately
| ... | The names of member variables. |
| #define USER_EXT_ANNOT | ( | name, | |
| ... | |||
| ) | namespace uSerExtAnnot { template <> struct ExtAttr<name> { using Type = ::uSer::DefAttr<__VA_ARGS__>; }; } |
Annotate external data type (struct)
Adds annotations to any type. It is recommended to only use this on structs. This macro must be called in the global namespace. See Non-Intrusive struct annotation
| name | The fully-qualified name of the annotated type (including namespaces) |
| ... | A list of attributes |
| #define USER_EXT_DEF_MEM | ( | sname, | |
| ... | |||
| ) | USER_PPM_MAP(USER_EXT_ENUM_MEM_I,sname,__VA_ARGS__) namespace uSerExtAnnot { template <> struct ExtStructMembers <sname>{ using Type = ::uSer::StructMembers<USER_PPM_MAP_LIST(USER_EXT_ENUM_MEM_GET_MPTR,sname,__VA_ARGS__)>; }; } |
Define and annotate multiple members of any external struct with attributes in one step. This macro must be called in the global namespace. See Non-Intrusive struct annotation.
| sname | The fully-qualified name of the surrounding struct (including namespaces) |
| ... | A sequence of the form (type1,name1,attributes1...),(type2,name2,attributes2...), ... |
| #define USER_EXT_ENUM_MEM | ( | sname, | |
| ... | |||
| ) | namespace uSerExtAnnot { template <> struct ExtStructMembers<sname> { using Type = ::uSer::StructMembers<USER_PPM_MAP_LIST(USER_ENUM_MEMPTR,sname,__VA_ARGS__)>; }; } |
List external struct members.
Makes the list of members of any struct known to µSer. This macro must be called in the global namespace. See Non-Intrusive struct annotation
| sname | The fully-qualified name of the surrounding struct (including namespaces) |
| ... | The names of member variables. |
| #define USER_EXT_MEM_ANNOT | ( | sname, | |
| name, | |||
| ... | |||
| ) | namespace uSerExtAnnot { template <> struct ExtMemAttr<&sname :: name> { using Type = ::uSer::DefAttr<__VA_ARGS__>; }; } |
Annotate external struct member.
Adds annotations to the member of any struct. This macro must be called in the global namespace. See Non-Intrusive struct annotation
| sname | The fully-qualified name of the surrounding struct (including namespaces) |
| name | Name of the member |
| ... | A list of attributes |
| #define USER_MEM | ( | type, | |
| name, | |||
| ... | |||
| ) | type name; USER_MEM_ANNOT(name, __VA_ARGS__) |
Define and annotate struct member.
Defines a member with type name and annotates it via USER_MEM_ANNOT in one step. See Defining and annotating a single member in one step
| type | The type for the member |
| name | The name for the member |
| #define USER_MEM_ANNOT | ( | name, | |
| ... | |||
| ) | static ::uSer::DefAttr<__VA_ARGS__> uSer_MemAttributes (::uSer::Helper::VTag<&uSer_Self:: name >); |
Define attributes for single struct member.
Call this macro if you want to annotate a single struct member. See Annotating a single struct member
| name | Name of the parameter |
| ... | A list of attributes. |
| #define USER_STRUCT | ( | name, | |
| ... | |||
| ) | using uSer_Self = name; using uSer_Attributes = ::uSer::DefAttr<__VA_ARGS__>; |
Begin intrusive struct definition.
Call this macro at the beginning of a struct definition. See Defining and annotating struct members separately
| name | The name of the struct |
| ... | A list of attributes. If none, specify uSer::AttrNone to avoid compiler warnings |
| enum uSer_ErrorCode |
Error code for serialization functions.
| Enumerator | |
|---|---|
| uSer_EOK |
No error was indicated (success) |
| uSer_EDYNRANGE |
The size of a dynamic data structure exceeds the allowed maximum. |
| uSer_EBUFSIZE |
Raw buffer overflow. |
| uSer_EHOOK |
This error is never raised by uSer, but can be used by hooks. |