summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/store.cc')
-rw-r--r--crawl-ref/source/store.cc1624
1 files changed, 0 insertions, 1624 deletions
diff --git a/crawl-ref/source/store.cc b/crawl-ref/source/store.cc
deleted file mode 100644
index 0ffa96e194..0000000000
--- a/crawl-ref/source/store.cc
+++ /dev/null
@@ -1,1624 +0,0 @@
-/*
- * File: store.cc
- * Summary: Saveable hash-table and vector capable of storing
- * multiple types of data.
- * Written by: Matthew Cline
- *
- * Modified for Crawl Reference by $Author$ on $Date$
- *
- * Change History (most recent first):
-
- * <1> 10/5/07 MPC Created
- */
-
-#include "AppHdr.h"
-#include "store.h"
-
-#include "externs.h"
-#include "tags.h"
-
-CrawlStoreValue::CrawlStoreValue()
- : type(SV_NONE), flags(SFLAG_UNSET)
-{
- val.ptr = NULL;
-}
-
-CrawlStoreValue::CrawlStoreValue(const CrawlStoreValue &other)
-{
- ASSERT(other.type >= SV_NONE && other.type < NUM_STORE_VAL_TYPES);
-
- type = other.type;
- flags = other.flags;
-
- if (flags & SFLAG_UNSET)
- {
- val = other.val;
- return;
- }
-
- switch (type)
- {
- case SV_NONE:
- case SV_BOOL:
- case SV_BYTE:
- case SV_SHORT:
- case SV_LONG:
- case SV_FLOAT:
- val = other.val;
- break;
-
- case SV_STR:
- {
- std::string* str;
- str = new std::string(*static_cast<std::string*>(other.val.ptr));
- val.ptr = static_cast<void*>(str);
- break;
- }
-
- case SV_COORD:
- {
- coord_def* coord;
- coord = new coord_def(*static_cast<coord_def*>(other.val.ptr));
- val.ptr = static_cast<void*>(coord);
- break;
- }
-
- case SV_ITEM:
- {
- item_def* item;
- item = new item_def(*static_cast<item_def*>(other.val.ptr));
- val.ptr = static_cast<void*>(item);
- break;
- }
-
- case SV_HASH:
- {
- CrawlHashTable* hash;
- CrawlHashTable* tmp = static_cast<CrawlHashTable*>(other.val.ptr);
- hash = new CrawlHashTable(*tmp);
- val.ptr = static_cast<void*>(hash);
- break;
- }
-
- case SV_VEC:
- {
- CrawlVector* vec;
- CrawlVector* tmp = static_cast<CrawlVector*>(other.val.ptr);
- vec = new CrawlVector(*tmp);
- val.ptr = static_cast<void*>(vec);
- break;
- }
-
- case NUM_STORE_VAL_TYPES:
- ASSERT(false);
- }
-}
-
-CrawlStoreValue::CrawlStoreValue(const store_flags _flags,
- const store_val_type _type)
- : type(_type), flags(_flags)
-{
- ASSERT(type >= SV_NONE && type < NUM_STORE_VAL_TYPES);
- ASSERT(!(flags & SFLAG_UNSET));
-
- flags |= SFLAG_UNSET;
- val.ptr = NULL;
-}
-
-// Conversion constructors
-CrawlStoreValue::CrawlStoreValue(const bool _val)
- : type(SV_BOOL), flags(0)
-{
- get_bool() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const char &_val)
- : type(SV_BYTE), flags(0)
-{
- get_byte() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const short &_val)
- : type(SV_SHORT), flags(0)
-{
- get_short() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const long &_val)
- : type(SV_LONG), flags(0)
-{
- get_long() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const float &_val)
- : type(SV_FLOAT), flags(0)
-{
- get_float() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const std::string &_val)
- : type(SV_STR), flags(0)
-{
- get_string() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const char* _val)
- : type(SV_STR), flags(0)
-{
- get_string() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const coord_def &_val)
- : type(SV_COORD), flags(0)
-{
- get_coord() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const item_def &_val)
- : type(SV_ITEM), flags(0)
-{
- get_item() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const CrawlHashTable &_val)
- : type(SV_HASH), flags(0)
-{
- get_table() = _val;
-}
-
-CrawlStoreValue::CrawlStoreValue(const CrawlVector &_val)
- : type(SV_VEC), flags(0)
-{
- get_vector() = _val;
-}
-
-CrawlStoreValue::~CrawlStoreValue()
-{
- unset(true);
-}
-
-void CrawlStoreValue::unset(bool force)
-{
- if (flags & SFLAG_UNSET)
- return;
-
- if (force)
- flags &= ~SFLAG_NO_ERASE;
-
- ASSERT(!(flags & SFLAG_NO_ERASE));
-
- switch (type)
- {
- case SV_BOOL:
- val.boolean = false;
- break;
-
- case SV_BYTE:
- val.byte = 0;
- break;
-
- case SV_SHORT:
- val._short = 0;
- break;
-
- case SV_LONG:
- val._long = 0;
- break;
-
- case SV_FLOAT:
- val._float = 0.0;
- break;
-
- case SV_STR:
- {
- std::string* str = static_cast<std::string*>(val.ptr);
- delete str;
- val.ptr = NULL;
- break;
- }
-
- case SV_COORD:
- {
- coord_def* coord = static_cast<coord_def*>(val.ptr);
- delete coord;
- val.ptr = NULL;
- break;
- }
-
- case SV_ITEM:
- {
- item_def* item = static_cast<item_def*>(val.ptr);
- delete item;
- val.ptr = NULL;
- break;
- }
-
- case SV_HASH:
- {
- CrawlHashTable* hash = static_cast<CrawlHashTable*>(val.ptr);
- delete hash;
- val.ptr = NULL;
- break;
- }
-
- case SV_VEC:
- {
- CrawlVector* vec = static_cast<CrawlVector*>(val.ptr);
- delete vec;
- val.ptr = NULL;
- break;
- }
-
- case SV_NONE:
- ASSERT(false);
-
- case NUM_STORE_VAL_TYPES:
- ASSERT(false);
- }
-
- flags |= SFLAG_UNSET;
-}
-
-// Only needed to do some assertion checking.
-CrawlStoreValue &CrawlStoreValue::operator = (const CrawlStoreValue &other)
-{
- ASSERT(other.type >= SV_NONE && other.type < NUM_STORE_VAL_TYPES);
- ASSERT(other.type != SV_NONE || type == SV_NONE);
-
- // NOTE: We don't bother checking SFLAG_CONST_VAL, since the
- // asignment operator is used when swapping two elements.
-
- if (!(flags & SFLAG_UNSET))
- {
- if (flags & SFLAG_CONST_TYPE)
- ASSERT(type == SV_NONE || type == other.type);
- }
-
- type = other.type;
- flags = other.flags;
- val = other.val;
-
- return (*this);
-}
-
-///////////////////////////////////
-// Meta-data accessors and changers
-store_flags CrawlStoreValue::get_flags() const
-{
- return flags;
-}
-
-store_flags CrawlStoreValue::set_flags(store_flags _flags)
-{
- flags |= _flags;
- return flags;
-}
-
-store_flags CrawlStoreValue::unset_flags(store_flags _flags)
-{
- flags &= ~_flags;
- return flags;
-}
-
-store_val_type CrawlStoreValue::get_type() const
-{
- return type;
-}
-
-//////////////////////////////
-// Read/write from/to savefile
-void CrawlStoreValue::write(tagHeader &th) const
-{
- ASSERT(!(flags & SFLAG_UNSET));
-
- marshallByte(th, (char) type);
- marshallByte(th, (char) flags);
-
- switch (type)
- {
- case SV_BOOL:
- marshallBoolean(th, val.boolean);
- break;
-
- case SV_BYTE:
- marshallByte(th, val.byte);
- break;
-
- case SV_SHORT:
- marshallShort(th, val._short);
- break;
-
- case SV_LONG:
- marshallLong(th, val._long);
- break;
-
- case SV_FLOAT:
- marshallFloat(th, val._float);
- break;
-
- case SV_STR:
- {
- std::string* str = static_cast<std::string*>(val.ptr);
- marshallString(th, *str);
- break;
- }
-
- case SV_COORD:
- {
- coord_def* coord = static_cast<coord_def*>(val.ptr);
- marshallCoord(th, *coord);
- break;
- }
-
- case SV_ITEM:
- {
- item_def* item = static_cast<item_def*>(val.ptr);
- marshallItem(th, *item);
- break;
- }
-
- case SV_HASH:
- {
- CrawlHashTable* hash = static_cast<CrawlHashTable*>(val.ptr);
- hash->write(th);
- break;
- }
-
- case SV_VEC:
- {
- CrawlVector* vec = static_cast<CrawlVector*>(val.ptr);
- vec->write(th);
- break;
- }
-
- case SV_NONE:
- ASSERT(false);
-
- case NUM_STORE_VAL_TYPES:
- ASSERT(false);
- }
-}
-
-void CrawlStoreValue::read(tagHeader &th)
-{
- type = static_cast<store_val_type>(unmarshallByte(th));
- flags = (store_flags) unmarshallByte(th);
-
- ASSERT(!(flags & SFLAG_UNSET));
-
- switch (type)
- {
- case SV_BOOL:
- val.boolean = unmarshallBoolean(th);
- break;
-
- case SV_BYTE:
- val.byte = unmarshallByte(th);
- break;
-
- case SV_SHORT:
- val._short = unmarshallShort(th);
- break;
-
- case SV_LONG:
- val._long = unmarshallLong(th);
- break;
-
- case SV_FLOAT:
- val._float = unmarshallFloat(th);
- break;
-
- case SV_STR:
- {
- std::string str = unmarshallString(th);
- val.ptr = (void*) new std::string(str);
- break;
- }
-
- case SV_COORD:
- {
- coord_def coord;
- unmarshallCoord(th, coord);
- val.ptr = (void*) new coord_def(coord);
-
- break;
- }
-
- case SV_ITEM:
- {
- item_def item;
- unmarshallItem(th, item);
- val.ptr = (void*) new item_def(item);
-
- break;
- }
-
- case SV_HASH:
- {
- CrawlHashTable* hash = new CrawlHashTable();
- hash->read(th);
- val.ptr = (void*) hash;
-
- break;
- }
-
- case SV_VEC:
- {
- CrawlVector* vec = new CrawlVector();
- vec->read(th);
- val.ptr = (void*) vec;
-
- break;
- }
-
- case SV_NONE:
- ASSERT(false);
-
- case NUM_STORE_VAL_TYPES:
- ASSERT(false);
- }
-}
-
-////////////////////////////////////////////////////////////////
-// Setup a new table with the given flags and/or type; assert if
-// a table already exists.
-CrawlHashTable &CrawlStoreValue::new_table(store_flags _flags)
-{
- return new_table(SV_NONE, flags);
-}
-
-CrawlHashTable &CrawlStoreValue::new_table(store_val_type _type,
- store_flags _flags)
-{
-#if DEBUG
- CrawlHashTable* old_table = static_cast<CrawlHashTable*>(val.ptr);
-
- ASSERT(flags & SFLAG_UNSET);
- ASSERT(type == SV_NONE
- || (type == SV_HASH
- && old_table->size() == 0
- && old_table->get_type() == SV_NONE
- && old_table->get_default_flags() == 0));
-#endif
-
- CrawlHashTable &table = get_table();
-
- table.default_flags = _flags;
- table.type = _type;
-
- type = SV_HASH;
- flags &= ~SFLAG_UNSET;
-
- return table;
-}
-
-////////////////////////////////////////////////////////////////
-// Setup a new vector with the given flags and/or type; assert if
-// a vector already exists.
-CrawlVector &CrawlStoreValue::new_vector(store_flags _flags,
- vec_size max_size)
-{
- return new_vector(SV_NONE, flags, max_size);
-}
-
-CrawlVector &CrawlStoreValue::new_vector(store_val_type _type,
- store_flags _flags,
- vec_size _max_size)
-{
-#if DEBUG
- CrawlVector* old_vector = static_cast<CrawlVector*>(val.ptr);
-
- ASSERT(flags & SFLAG_UNSET);
- ASSERT(type == SV_NONE
- || (type == SV_VEC
- && old_vector->size() == 0
- && old_vector->get_type() == SV_NONE
- && old_vector->get_default_flags() == 0
- && old_vector->get_max_size() == VEC_MAX_SIZE));
-#endif
-
- CrawlVector &vector = get_vector();
-
- vector.default_flags = _flags;
- vector.type = _type;
-
- type = SV_VEC;
- flags &= ~SFLAG_UNSET;
-
- return vector;
-}
-
-///////////////////////////////////////////
-// Dynamic type-checking accessor functions
-#define GET_VAL(x, _type, field, value) \
- ASSERT((flags & SFLAG_UNSET) || !(flags & SFLAG_CONST_VAL)); \
- if (type != (x)) \
- { \
- if (type == SV_NONE) \
- { \
- type = (x); \
- field = (value); \
- } \
- else \
- { \
- ASSERT(!(flags & SFLAG_CONST_TYPE)); \
- switch(type) \
- { \
- case SV_BOOL: \
- field = (_type) val.boolean; \
- break; \
- case SV_BYTE: \
- field = (_type) val.byte; \
- break; \
- case SV_SHORT: \
- field = (_type) val._short; \
- break; \
- case SV_LONG: \
- field = (_type) val._long; \
- break; \
- case SV_FLOAT: \
- field = (_type) val._float; \
- break; \
- default: \
- ASSERT(false); \
- } \
- type = (x); \
- } \
- } \
- flags &= ~SFLAG_UNSET; \
- return field;
-
-#define GET_VAL_PTR(x, _type, value) \
- ASSERT((flags & SFLAG_UNSET) || !(flags & SFLAG_CONST_VAL)); \
- if (type != (x)) \
- { \
- if (type == SV_NONE) \
- { \
- type = (x); \
- val.ptr = (value); \
- } \
- else \
- { \
- unset(); \
- val.ptr = (value); \
- type = (x); \
- } \
- } \
- flags &= ~SFLAG_UNSET; \
- return *((_type) val.ptr);
-
-bool &CrawlStoreValue::get_bool()
-{
- GET_VAL(SV_BOOL, bool, val.boolean, false);
-}
-
-char &CrawlStoreValue::get_byte()
-{
- GET_VAL(SV_BYTE, char, val.byte, 0);
-}
-
-short &CrawlStoreValue::get_short()
-{
- GET_VAL(SV_SHORT, short, val._short, 0);
-}
-
-long &CrawlStoreValue::get_long()
-{
- GET_VAL(SV_LONG, long, val._long, 0);
-}
-
-float &CrawlStoreValue::get_float()
-{
- GET_VAL(SV_FLOAT, float, val._float, 0.0);
-}
-
-std::string &CrawlStoreValue::get_string()
-{
- GET_VAL_PTR(SV_STR, std::string*, new std::string(""));
-}
-
-coord_def &CrawlStoreValue::get_coord()
-{
- GET_VAL_PTR(SV_COORD, coord_def*, new coord_def());
-}
-
-item_def &CrawlStoreValue::get_item()
-{
- GET_VAL_PTR(SV_ITEM, item_def*, new item_def());
-}
-
-CrawlHashTable &CrawlStoreValue::get_table()
-{
- GET_VAL_PTR(SV_HASH, CrawlHashTable*, new CrawlHashTable());
-}
-
-CrawlVector &CrawlStoreValue::get_vector()
-{
- GET_VAL_PTR(SV_VEC, CrawlVector*, new CrawlVector());
-}
-
-CrawlStoreValue &CrawlStoreValue::operator [] (const std::string &key)
-{
- return get_table()[key];
-}
-
-CrawlStoreValue &CrawlStoreValue::operator [] (const vec_size &index)
-{
- return get_vector()[index];
-}
-
-///////////////////////////
-// Const accessor functions
-#define GET_CONST_SETUP(x) \
- ASSERT(!(flags & SFLAG_UNSET)); \
- ASSERT(type == (x));
-
-bool CrawlStoreValue::get_bool() const
-{
- GET_CONST_SETUP(SV_BOOL);
- return val.boolean;
-}
-
-char CrawlStoreValue::get_byte() const
-{
- GET_CONST_SETUP(SV_BYTE);
- return val.byte;
-}
-
-short CrawlStoreValue::get_short() const
-{
- GET_CONST_SETUP(SV_SHORT);
- return val._short;
-}
-
-long CrawlStoreValue::get_long() const
-{
- GET_CONST_SETUP(SV_LONG);
- return val._long;
-}
-
-float CrawlStoreValue::get_float() const
-{
- GET_CONST_SETUP(SV_FLOAT);
- return val._float;
-}
-
-std::string CrawlStoreValue::get_string() const
-{
- GET_CONST_SETUP(SV_STR);
- return *((std::string*)val.ptr);
-}
-
-coord_def CrawlStoreValue::get_coord() const
-{
- GET_CONST_SETUP(SV_COORD);
- return *((coord_def*)val.ptr);
-}
-
-const item_def& CrawlStoreValue::get_item() const
-{
- GET_CONST_SETUP(SV_ITEM);
- return *((item_def*)val.ptr);
-}
-
-const CrawlHashTable& CrawlStoreValue::get_table() const
-{
- GET_CONST_SETUP(SV_HASH);
- return *((CrawlHashTable*)val.ptr);
-}
-
-const CrawlVector& CrawlStoreValue::get_vector() const
-{
- GET_CONST_SETUP(SV_VEC);
- return *((CrawlVector*)val.ptr);
-}
-
-const CrawlStoreValue &CrawlStoreValue::operator
- [] (const std::string &key) const
-{
- return get_table()[key];
-}
-
-const CrawlStoreValue &CrawlStoreValue::operator
- [](const vec_size &index) const
-{
- return get_vector()[index];
-}
-
-/////////////////////
-// Typecast operators
-&CrawlStoreValue::operator bool()
-{
- return get_bool();
-}
-
-&CrawlStoreValue::operator char()
-{
- return get_byte();
-}
-
-&CrawlStoreValue::operator short()
-{
- return get_short();
-}
-
-&CrawlStoreValue::operator float()
-{
- return get_float();
-}
-
-&CrawlStoreValue::operator long()
-{
- return get_long();
-}
-
-&CrawlStoreValue::operator std::string()
-{
- return get_string();
-}
-
-&CrawlStoreValue::operator coord_def()
-{
- return get_coord();
-}
-
-&CrawlStoreValue::operator CrawlHashTable()
-{
- return get_table();
-}
-
-&CrawlStoreValue::operator CrawlVector()
-{
- return get_vector();
-}
-
-&CrawlStoreValue::operator item_def()
-{
- return get_item();
-}
-
-///////////////////////////
-// Const typecast operators
-CrawlStoreValue::operator bool() const
-{
- return get_bool();
-}
-
-#define CONST_INT_CAST() \
- switch(type) \
- { \
- case SV_BYTE: \
- return get_byte(); \
- case SV_SHORT: \
- return get_short(); \
- case SV_LONG: \
- return get_long(); \
- default: \
- ASSERT(false); \
- return 0; \
- }
-
-CrawlStoreValue::operator char() const
-{
- CONST_INT_CAST();
-}
-
-CrawlStoreValue::operator short() const
-{
- CONST_INT_CAST();
-}
-
-CrawlStoreValue::operator long() const
-{
- CONST_INT_CAST();
-}
-
-CrawlStoreValue::operator float() const
-{
- return get_float();
-}
-
-CrawlStoreValue::operator std::string() const
-{
- return get_string();
-}
-
-CrawlStoreValue::operator coord_def() const
-{
- return get_coord();
-}
-
-///////////////////////
-// Assignment operators
-CrawlStoreValue &CrawlStoreValue::operator = (const bool &_val)
-{
- get_bool() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const char &_val)
-{
- get_byte() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const short &_val)
-{
- get_short() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const long &_val)
-{
- get_long() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const float &_val)
-{
- get_float() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const std::string &_val)
-{
- get_string() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const char* _val)
-{
- get_string() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const coord_def &_val)
-{
- get_coord() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const CrawlHashTable &_val)
-{
- get_table() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const CrawlVector &_val)
-{
- get_vector() = _val;
- return (*this);
-}
-
-CrawlStoreValue &CrawlStoreValue::operator = (const item_def &_val)
-{
- get_item() = _val;
- return (*this);
-}
-
-///////////////////////////////////////////////////
-// Non-assignment operators which affect the lvalue
-#define INT_OPERATOR_UNARY(op) \
- switch(type) \
- { \
- case SV_BYTE: \
- { \
- char &temp = get_byte(); \
- temp op; \
- return temp; \
- } \
- \
- case SV_SHORT: \
- { \
- short &temp = get_short(); \
- temp op; \
- return temp; \
- } \
- case SV_LONG: \
- { \
- long &temp = get_long(); \
- temp op; \
- return temp; \
- } \
- \
- default: \
- ASSERT(false); \
- return 0; \
- }
-
-// Prefix
-long CrawlStoreValue::operator ++ ()
-{
- INT_OPERATOR_UNARY(++);
-}
-
-long CrawlStoreValue::operator -- ()
-{
- INT_OPERATOR_UNARY(--);
-}
-
-// Postfix
-long CrawlStoreValue::operator ++ (int)
-{
- INT_OPERATOR_UNARY(++);
-}
-
-long CrawlStoreValue::operator -- (int)
-{
- INT_OPERATOR_UNARY(--);
-}
-
-std::string &CrawlStoreValue::operator += (const std::string &_val)
-{
- return (get_string() += _val);
-}
-
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-
-CrawlHashTable::CrawlHashTable()
- : type(SV_NONE), default_flags(0)
-{
-}
-
-CrawlHashTable::CrawlHashTable(store_flags flags)
- : type(SV_NONE), default_flags(flags)
-{
- ASSERT(!(default_flags & SFLAG_UNSET));
-}
-
-CrawlHashTable::CrawlHashTable(store_val_type _type, store_flags flags)
- : type(_type), default_flags(flags)
-{
- ASSERT(type >= SV_NONE && type < NUM_STORE_VAL_TYPES);
- ASSERT(!(default_flags & SFLAG_UNSET));
-}
-
-CrawlHashTable::~CrawlHashTable()
-{
- assert_validity();
-}
-
-//////////////////////////////
-// Read/write from/to savefile
-void CrawlHashTable::write(tagHeader &th) const
-{
- assert_validity();
- if (empty())
- {
- marshallByte(th, 0);
- return;
- }
-
- marshallByte(th, size());
- marshallByte(th, static_cast<char>(type));
- marshallByte(th, (char) default_flags);
-
- CrawlHashTable::hash_map_type::const_iterator i = hash_map.begin();
-
- for (; i != hash_map.end(); i++)
- {
- marshallString(th, i->first);
- i->second.write(th);
- }
-
- assert_validity();
-}
-
-void CrawlHashTable::read(tagHeader &th)
-{
- assert_validity();
-
- ASSERT(empty());
- ASSERT(type == SV_NONE);
- ASSERT(default_flags == 0);
-
- hash_size _size = (hash_size) unmarshallByte(th);
-
- if (_size == 0)
- return;
-
- type = static_cast<store_val_type>(unmarshallByte(th));
- default_flags = (store_flags) unmarshallByte(th);
-
- for (hash_size i = 0; i < _size; i++)
- {
- std::string key = unmarshallString(th);
- CrawlStoreValue &val = (*this)[key];
-
- val.read(th);
- }
-
- assert_validity();
-}
-
-
-//////////////////
-// Misc functions
-
-store_flags CrawlHashTable::get_default_flags() const
-{
- assert_validity();
- return default_flags;
-}
-
-store_flags CrawlHashTable::set_default_flags(store_flags flags)
-{
- assert_validity();
- ASSERT(!(flags & SFLAG_UNSET));
- default_flags |= flags;
-
- return default_flags;
-}
-
-store_flags CrawlHashTable::unset_default_flags(store_flags flags)
-{
- assert_validity();
- ASSERT(!(flags & SFLAG_UNSET));
- default_flags &= ~flags;
-
- return default_flags;
-}
-
-store_val_type CrawlHashTable::get_type() const
-{
- assert_validity();
- return type;
-}
-
-bool CrawlHashTable::exists(const std::string key) const
-{
- assert_validity();
- hash_map_type::const_iterator i = hash_map.find(key);
-
- return (i != hash_map.end());
-}
-
-void CrawlHashTable::assert_validity() const
-{
-#if DEBUG
- ASSERT(!(default_flags & SFLAG_UNSET));
-
- hash_map_type::const_iterator i = hash_map.begin();
-
- unsigned long actual_size = 0;
-
- for (; i != hash_map.end(); i++)
- {
- actual_size++;
-
- const std::string &key = i->first;
- const CrawlStoreValue &val = i->second;
-
- ASSERT(key != "");
- std::string trimmed = trimmed_string(key);
- ASSERT(key == trimmed);
-
- ASSERT(val.type != SV_NONE);
- ASSERT(!(val.flags & SFLAG_UNSET));
-
- switch(val.type)
- {
- case SV_STR:
- case SV_COORD:
- case SV_ITEM:
- ASSERT(val.val.ptr != NULL);
- break;
-
- case SV_HASH:
- {
- ASSERT(val.val.ptr != NULL);
-
- CrawlHashTable* nested;
- nested = static_cast<CrawlHashTable*>(val.val.ptr);
-
- nested->assert_validity();
- break;
- }
-
- default:
- break;
- }
- }
-
- ASSERT(size() == actual_size);
-#endif
-}
-
-////////////////////////////////
-// Accessors to contained values
-
-CrawlStoreValue& CrawlHashTable::get_value(const std::string &key)
-{
- assert_validity();
- iterator i = hash_map.find(key);
-
- if (i == hash_map.end())
- {
- hash_map[key] = CrawlStoreValue(default_flags);
- CrawlStoreValue &val = hash_map[key];
-
- if (type != SV_NONE)
- {
- val.type = type;
- val.flags |= SFLAG_CONST_TYPE;
- }
-
- return (val);
- }
-
- return (i->second);
-}
-
-const CrawlStoreValue& CrawlHashTable::get_value(const std::string &key) const
-{
- assert_validity();
- hash_map_type::const_iterator i = hash_map.find(key);
-
- ASSERT(i != hash_map.end());
- ASSERT(i->second.type != SV_NONE);
- ASSERT(!(i->second.flags & SFLAG_UNSET));
-
- return (i->second);
-}
-
-CrawlStoreValue& CrawlHashTable::operator[] (const std::string &key)
-{
- return get_value(key);
-}
-
-const CrawlStoreValue& CrawlHashTable::operator[] (const std::string &key)
- const
-{
- return get_value(key);
-}
-
-///////////////////////////
-// std::map style interface
-hash_size CrawlHashTable::size() const
-{
- return hash_map.size();
-}
-
-bool CrawlHashTable::empty() const
-{
- return hash_map.empty();
-}
-
-void CrawlHashTable::erase(const std::string key)
-{
- assert_validity();
- iterator i = hash_map.find(key);
-
- if (i != hash_map.end())
- {
-#if DEBUG
- CrawlStoreValue &val = i->second;
- ASSERT(!(val.flags & SFLAG_NO_ERASE));
-#endif
-
- hash_map.erase(i);
- }
-}
-
-void CrawlHashTable::clear()
-{
- assert_validity();
- ASSERT(!(default_flags & SFLAG_NO_ERASE));
-
- iterator i = hash_map.begin();
- for (; i != hash_map.end(); i++)
- ASSERT(!(i->second.flags & SFLAG_NO_ERASE));
-
- hash_map.clear();
- default_flags = 0;
- type = SV_NONE;
-}
-
-CrawlHashTable::iterator CrawlHashTable::begin()
-{
- assert_validity();
- return hash_map.begin();
-}
-
-CrawlHashTable::iterator CrawlHashTable::end()
-{
- assert_validity();
- return hash_map.end();
-}
-
-CrawlHashTable::const_iterator CrawlHashTable::begin() const
-{
- assert_validity();
- return hash_map.begin();
-}
-
-CrawlHashTable::const_iterator CrawlHashTable::end() const
-{
- assert_validity();
- return hash_map.end();
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-CrawlVector::CrawlVector()
- : type(SV_NONE), default_flags(0), max_size(VEC_MAX_SIZE)
-{
-}
-
-CrawlVector::CrawlVector(store_flags flags, vec_size _max_size)
- : type(SV_NONE), default_flags(flags), max_size(_max_size)
-{
- ASSERT(!(default_flags & SFLAG_UNSET));
- ASSERT(max_size > 0);
-}
-
-CrawlVector::CrawlVector(store_val_type _type, store_flags flags,
- vec_size _max_size)
- : type(_type), default_flags(flags), max_size(_max_size)
-{
- ASSERT(type >= SV_NONE && type < NUM_STORE_VAL_TYPES);
- ASSERT(!(default_flags & SFLAG_UNSET));
- ASSERT(max_size > 0);
-}
-
-CrawlVector::~CrawlVector()
-{
- assert_validity();
-}
-
-//////////////////////////////
-// Read/write from/to savefile
-void CrawlVector::write(tagHeader &th) const
-{
- assert_validity();
- if (empty())
- {
- marshallByte(th, 0);
- return;
- }
-
- marshallByte(th, (char) size());
- marshallByte(th, (char) max_size);
- marshallByte(th, static_cast<char>(type));
- marshallByte(th, (char) default_flags);
-
- for (vec_size i = 0; i < size(); i++)
- {
- CrawlStoreValue val = vector[i];
- ASSERT(val.type != SV_NONE);
- ASSERT(!(val.flags & SFLAG_UNSET));
- val.write(th);
- }
-
- assert_validity();
-}
-
-void CrawlVector::read(tagHeader &th)
-{
- assert_validity();
-
- ASSERT(empty());
- ASSERT(type == SV_NONE);
- ASSERT(default_flags == 0);
- ASSERT(max_size == VEC_MAX_SIZE);
-
- vec_size _size = (vec_size) unmarshallByte(th);
-
- if (_size == 0)
- return;
-
- max_size = static_cast<vec_size>(unmarshallByte(th));
- type = static_cast<store_val_type>(unmarshallByte(th));
- default_flags = static_cast<store_flags>(unmarshallByte(th));
-
- ASSERT(_size <= max_size);
-
- vector.resize(_size);
-
- for (vec_size i = 0; i < _size; i++)
- vector[i].read(th);
-
- assert_validity();
-}
-
-
-//////////////////
-// Misc functions
-
-store_flags CrawlVector::get_default_flags() const
-{
- assert_validity();
- return default_flags;
-}
-
-store_flags CrawlVector::set_default_flags(store_flags flags)
-{
- assert_validity();
- ASSERT(!(flags & SFLAG_UNSET));
- default_flags |= flags;
-
- return default_flags;
-}
-
-store_flags CrawlVector::unset_default_flags(store_flags flags)
-{
- assert_validity();
- ASSERT(!(flags & SFLAG_UNSET));
- default_flags &= ~flags;
-
- return default_flags;
-}
-
-store_val_type CrawlVector::get_type() const
-{
- assert_validity();
- return type;
-}
-
-void CrawlVector::assert_validity() const
-{
-#if DEBUG
- ASSERT(!(default_flags & SFLAG_UNSET));
- ASSERT(max_size > 0);
- ASSERT(max_size >= size());
-
- for (vec_size i = 0, _size = size(); i < _size; i++)
- {
- const CrawlStoreValue &val = vector[i];
-
- // A vector might be resize()'d and filled up with unset
- // values, which are then set one by one, so we can't
- // assert over that here.
- if (val.type == SV_NONE || (val.flags & SFLAG_UNSET))
- continue;
-
- switch(val.type)
- {
- case SV_STR:
- case SV_COORD:
- case SV_ITEM:
- ASSERT(val.val.ptr != NULL);
- break;
-
- case SV_HASH:
- {
- ASSERT(val.val.ptr != NULL);
-
- CrawlVector* nested;
- nested = static_cast<CrawlVector*>(val.val.ptr);
-
- nested->assert_validity();
- break;
- }
-
- case SV_VEC:
- {
- ASSERT(val.val.ptr != NULL);
-
- CrawlVector* nested;
- nested = static_cast<CrawlVector*>(val.val.ptr);
-
- nested->assert_validity();
- break;
- }
-
- default:
- break;
- }
- }
-#endif
-}
-
-void CrawlVector::set_max_size(vec_size _size)
-{
- ASSERT(_size > 0);
- ASSERT(max_size == VEC_MAX_SIZE);
- max_size = _size;
-
- vector.reserve(max_size);
-}
-
-vec_size CrawlVector::get_max_size() const
-{
- return max_size;
-}
-
-
-////////////////////////////////
-// Accessors to contained values
-
-CrawlStoreValue& CrawlVector::get_value(const vec_size &index)
-{
- assert_validity();
-
- ASSERT(index <= max_size);
- ASSERT(index <= vector.size());
-
- return vector[index];
-}
-
-const CrawlStoreValue& CrawlVector::get_value(const vec_size &index) const
-{
- assert_validity();
-
- ASSERT(index <= max_size);
- ASSERT(index <= vector.size());
-
- return vector[index];
-}
-
-CrawlStoreValue& CrawlVector::operator[] (const vec_size &index)
-{
- return get_value(index);
-}
-
-const CrawlStoreValue& CrawlVector::operator[] (const vec_size &index) const
-{
- return get_value(index);
-}
-
-///////////////////////////
-// std::vector style interface
-vec_size CrawlVector::size() const
-{
- return vector.size();
-}
-
-bool CrawlVector::empty() const
-{
- return vector.empty();
-}
-
-CrawlStoreValue& CrawlVector::pop_back()
-{
- assert_validity();
- ASSERT(vector.size() > 0);
-
- CrawlStoreValue& val = vector[vector.size() - 1];
- vector.pop_back();
- return val;
-}
-
-void CrawlVector::push_back(CrawlStoreValue val)
-{
- assert_validity();
- ASSERT(vector.size() < max_size);
- ASSERT(type == SV_NONE
- || (val.type == SV_NONE && (val.flags & SFLAG_UNSET))
- || (val.type == type));
- val.flags |= default_flags;
- if (type != SV_NONE)
- {
- val.type = type;
- val.flags |= SFLAG_CONST_TYPE;
- }
- vector.push_back(val);
-}
-
-void CrawlVector::insert(const vec_size index, CrawlStoreValue val)
-{
- assert_validity();
- ASSERT(vector.size() < max_size);
- ASSERT(type == SV_NONE
- || (val.type == SV_NONE && (val.flags & SFLAG_UNSET))
- || (val.type == type));
- val.flags |= default_flags;
- if (type != SV_NONE)
- {
- val.type = type;
- val.flags |= SFLAG_CONST_TYPE;
- }
- vector.insert(vector.begin() + index, val);
-}
-
-void CrawlVector::resize(const vec_size _size)
-{
- assert_validity();
- ASSERT(max_size == VEC_MAX_SIZE);
- ASSERT(_size < max_size);
-
- vec_size old_size = size();
- vector.resize(_size);
-
- for (vec_size i = old_size; i < _size; i++)
- {
- vector[i].flags = SFLAG_UNSET | default_flags;
- vector[i].type = SV_NONE;
- }
-}
-
-void CrawlVector::erase(const vec_size index)
-{
- assert_validity();
- ASSERT(index <= max_size);
- ASSERT(index <= vector.size());
-
- vector.erase(vector.begin() + index);
-}
-
-void CrawlVector::clear()
-{
- assert_validity();
- ASSERT(!(default_flags & SFLAG_NO_ERASE));
-
- for (vec_size i = 0, _size = size(); i < _size; i++)
- ASSERT(!(vector[i].flags & SFLAG_NO_ERASE));
-
- vector.clear();
- default_flags = 0;
- type = SV_NONE;
-}
-
-CrawlVector::iterator CrawlVector::begin()
-{
- assert_validity();
- return vector.begin();
-}
-
-CrawlVector::iterator CrawlVector::end()
-{
- assert_validity();
- return vector.end();
-}
-
-CrawlVector::const_iterator CrawlVector::begin() const
-{
- assert_validity();
- return vector.begin();
-}
-
-CrawlVector::const_iterator CrawlVector::end() const
-{
- assert_validity();
- return vector.end();
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////
-
-template <typename T, store_val_type TYPE>
-CrawlTableWrapper<T, TYPE>::CrawlTableWrapper()
-{
- table = NULL;
-}
-
-template <typename T, store_val_type TYPE>
-CrawlTableWrapper<T, TYPE>::CrawlTableWrapper(CrawlHashTable& _table)
-{
- wrap(_table);
-}
-
-template <typename T, store_val_type TYPE>
-CrawlTableWrapper<T, TYPE>::CrawlTableWrapper(CrawlHashTable* _table)
-{
- wrap(_table);
-}
-
-template <typename T, store_val_type TYPE>
-void CrawlTableWrapper<T, TYPE>::wrap(CrawlHashTable& _table)
-{
- wrap(&_table);
-}
-
-template <typename T, store_val_type TYPE>
-void CrawlTableWrapper<T, TYPE>::wrap(CrawlHashTable* _table)
-{
- ASSERT(_table != NULL);
- ASSERT(_table->get_type() == TYPE);
-
- table = _table;
-}
-
-template <typename T, store_val_type TYPE>
-T& CrawlTableWrapper<T, TYPE>::operator[] (const std::string &key)
-{
- return (T&) (*table)[key];
-}
-
-template <typename T, store_val_type TYPE>
-const T CrawlTableWrapper<T, TYPE>::operator[] (const std::string &key) const
-{
- return (T) (*table)[key];
-}