From ada5301a6dd6ba6d713a7aeb566d1ef14a000eb1 Mon Sep 17 00:00:00 2001 From: Stefan O'Rear Date: Fri, 13 Nov 2009 02:04:30 -0800 Subject: Add new, futureproof enum serialization primitives --- crawl-ref/source/tags.h | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'crawl-ref/source/tags.h') diff --git a/crawl-ref/source/tags.h b/crawl-ref/source/tags.h index 773c686b49..1d72c856a0 100644 --- a/crawl-ref/source/tags.h +++ b/crawl-ref/source/tags.h @@ -65,6 +65,47 @@ enum tag_minor_version TAG_MINOR_VERSION = 12 // Current version. (Keep equal to max.) }; +struct enum_info +{ + void (*collect)(std::vector >& prs); + int replacement; + + struct enum_val + { + int value; + const char *name; + }; + + const enum_val *historical; + tag_minor_version non_historical_first; + char historic_bytes; +}; + +struct enum_write_state +{ + std::set used; + std::map names; + char store_type; + + enum_write_state() : used(), names(), store_type(0) {} +}; + +struct enum_read_state +{ + std::map mapping; + std::map names; + char store_type; + + enum_read_state() : mapping(), names(), store_type(0) {} +}; + +template struct enum_details; + +// TO ADD A NEW ENUM UNDER THE UMBRELLA OF marshallEnum: +// * Create an enum_info instance +// * Instanciate the enum_details template +// * Change existing serialization to use marshallEnum +// * Bump minor version /* *********************************************************************** * writer API @@ -85,6 +126,9 @@ public: private: FILE* _file; std::vector* _pbuf; + + std::map used_enums; + friend void marshallEnumVal(writer&, const enum_info*, int); }; void marshallByte (writer &, const char& ); @@ -99,6 +143,14 @@ void marshallItem (writer &, const item_def &); void marshallMonster (writer &, const monsters &); void marshallShowtype (writer &, const show_type &); +void marshallEnumVal (writer &, const enum_info *, int); + +template +inline void marshallEnum(writer& wr, enm value) +{ + marshallEnumVal(wr, &enum_details::desc, static_cast(value)); +} + /* *********************************************************************** * reader API * *********************************************************************** */ @@ -123,6 +175,9 @@ private: const std::vector* _pbuf; unsigned int _read_offset; char _minorVersion; + + std::map seen_enums; + friend int unmarshallEnumVal(reader &, const enum_info *); }; char unmarshallByte (reader &); @@ -138,6 +193,14 @@ void unmarshallItem (reader &, item_def &item); void unmarshallMonster (reader &, monsters &item); show_type unmarshallShowtype (reader &); +int unmarshallEnumVal (reader &, const enum_info *); + +template +inline enm unmarshallEnum(writer& wr) +{ + return static_cast(unmarshallEnumVal(wr, &enum_details::desc)); +} + /* *********************************************************************** * Tag interface * *********************************************************************** */ -- cgit v1.2.3-54-g00ecf