|
| 1 | +#pragma once |
| 2 | + |
1 | 3 | #include <bluegrass/meta/preprocessor.hpp> |
| 4 | +#include <boost/preprocessor/seq/for_each.hpp> |
| 5 | +#include <boost/preprocessor/seq/enum.hpp> |
| 6 | +#include <boost/preprocessor/seq/size.hpp> |
| 7 | +#include <boost/preprocessor/seq/seq.hpp> |
| 8 | +#include <boost/preprocessor/stringize.hpp> |
2 | 9 |
|
3 | 10 | #define SYSLIB_REFLECT_MEMBER_OP( OP, elem ) \ |
4 | 11 | OP t.elem |
5 | 12 |
|
| 13 | +#define SYSLIB_REFLECT_MEMBER_COUNT( OP, elem ) \ |
| 14 | + OP 1 |
| 15 | + |
| 16 | +#define SYSLIB_REFLECT_SEQ_NIL(x) (x) |
| 17 | + |
| 18 | +//#define SYSLIB_REFLECT_ENUM(...) BLUEGRASS_META_SEQ_ENUM(__VA_ARGS__) |
6 | 19 | /** |
7 | 20 | * @defgroup serialize Serialize |
8 | 21 | * @ingroup core |
|
19 | 32 | #define SYSLIB_SERIALIZE( TYPE, MEMBERS ) \ |
20 | 33 | template<typename DataStream> \ |
21 | 34 | friend DataStream& operator << ( DataStream& ds, const TYPE& t ){ \ |
22 | | - return ds BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_OP, <<, MEMBERS );\ |
| 35 | + uint32_t member_count = 0 BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_COUNT, +, MEMBERS ) ; \ |
| 36 | + return member_count == 0 ? ds : (ds BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_OP, <<, MEMBERS ));\ |
23 | 37 | }\ |
24 | 38 | template<typename DataStream> \ |
25 | 39 | friend DataStream& operator >> ( DataStream& ds, TYPE& t ){ \ |
26 | | - return ds BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_OP, >>, MEMBERS );\ |
| 40 | + uint32_t member_count = 0 BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_COUNT, +, MEMBERS ) ; \ |
| 41 | + return member_count == 0 ? ds : (ds BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_OP, >>, MEMBERS ));\ |
27 | 42 | } |
28 | 43 |
|
29 | 44 | /** |
|
39 | 54 | template<typename DataStream> \ |
40 | 55 | friend DataStream& operator << ( DataStream& ds, const TYPE& t ){ \ |
41 | 56 | ds << static_cast<const BASE&>(t); \ |
42 | | - return ds BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_OP, <<, MEMBERS );\ |
| 57 | + uint32_t member_count = 0 BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_COUNT, +, MEMBERS ); \ |
| 58 | + return member_count == 0 ? ds : (ds BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_OP, <<, MEMBERS ));\ |
43 | 59 | }\ |
44 | 60 | template<typename DataStream> \ |
45 | 61 | friend DataStream& operator >> ( DataStream& ds, TYPE& t ){ \ |
46 | 62 | ds >> static_cast<BASE&>(t); \ |
47 | | - return ds BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_OP, >>, MEMBERS );\ |
| 63 | + uint32_t member_count = 0 BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_COUNT, +, MEMBERS ); \ |
| 64 | + return member_count == 0 ? ds : (ds BLUEGRASS_META_FOREACH_SEQ( SYSLIB_REFLECT_MEMBER_OP, >>, MEMBERS ));\ |
48 | 65 | } |
| 66 | + |
| 67 | +#define SYSLIB_SERIALIZE_DERIVED_EMPTY( TYPE, BASE ) \ |
| 68 | +template<typename DataStream> \ |
| 69 | +friend DataStream& operator << ( DataStream& ds, const TYPE& t ){ \ |
| 70 | +ds << static_cast<const BASE&>(t); \ |
| 71 | +return ds;\ |
| 72 | +}\ |
| 73 | +template<typename DataStream> \ |
| 74 | +friend DataStream& operator >> ( DataStream& ds, TYPE& t ){ \ |
| 75 | +ds >> static_cast<BASE&>(t); \ |
| 76 | +return ds;\ |
| 77 | +} |
0 commit comments