summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/store.h
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/store.h')
-rw-r--r--crawl-ref/source/store.h402
1 files changed, 0 insertions, 402 deletions
diff --git a/crawl-ref/source/store.h b/crawl-ref/source/store.h
deleted file mode 100644
index 434c0cd74d..0000000000
--- a/crawl-ref/source/store.h
+++ /dev/null
@@ -1,402 +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
- */
-
-#ifndef STORE_H
-#define STORE_H
-
-#include <limits.h>
-#include <map>
-#include <string>
-#include <vector>
-
-struct tagHeader;
-class CrawlHashTable;
-class CrawlVector;
-class item_def;
-class coord_def;
-
-typedef unsigned char hash_size;
-typedef unsigned char vec_size;
-typedef unsigned char store_flags;
-
-#define VEC_MAX_SIZE 255
-#define HASH_MAX_SIZE 255
-
-// NOTE: Changing the ordering of these enums will break savefile
-// compatibility.
-enum store_val_type
-{
- SV_NONE = 0,
- SV_BOOL,
- SV_BYTE,
- SV_SHORT,
- SV_LONG,
- SV_FLOAT,
- SV_STR,
- SV_COORD,
- SV_ITEM,
- SV_HASH,
- SV_VEC,
- NUM_STORE_VAL_TYPES
-};
-
-enum store_flag_type
-{
- SFLAG_UNSET = (1 << 0),
- SFLAG_CONST_VAL = (1 << 1),
- SFLAG_CONST_TYPE = (1 << 2),
- SFLAG_NO_ERASE = (1 << 3)
-};
-
-
-// Can't just cast everything into a void pointer, since a float might
-// not fit into a pointer on all systems.
-typedef union StoreUnion StoreUnion;
-union StoreUnion
-{
- bool boolean;
- char byte;
- short _short;
- long _long;
- float _float;
- void* ptr;
-};
-
-
-class CrawlStoreValue
-{
-public:
- CrawlStoreValue();
- CrawlStoreValue(const CrawlStoreValue &other);
-
- ~CrawlStoreValue();
-
- // Conversion constructors
- CrawlStoreValue(const bool val);
- CrawlStoreValue(const char &val);
- CrawlStoreValue(const short &val);
- CrawlStoreValue(const long &val);
- CrawlStoreValue(const float &val);
- CrawlStoreValue(const std::string &val);
- CrawlStoreValue(const char* val);
- CrawlStoreValue(const coord_def &val);
- CrawlStoreValue(const item_def &val);
- CrawlStoreValue(const CrawlHashTable &val);
- CrawlStoreValue(const CrawlVector &val);
-
- // Only needed for doing some assertion checking.
- CrawlStoreValue &operator = (const CrawlStoreValue &other);
-
-protected:
- store_val_type type;
- store_flags flags;
- StoreUnion val;
-
-public:
- store_flags get_flags() const;
- store_flags set_flags(store_flags flags);
- store_flags unset_flags(store_flags flags);
- store_val_type get_type() const;
-
- CrawlHashTable &new_table(store_flags flags);
- CrawlHashTable &new_table(store_val_type type, store_flags flags = 0);
-
- CrawlVector &new_vector(store_flags flags,
- vec_size max_size = VEC_MAX_SIZE);
- CrawlVector &new_vector(store_val_type type, store_flags flags = 0,
- vec_size max_size = VEC_MAX_SIZE);
-
- bool &get_bool();
- char &get_byte();
- short &get_short();
- long &get_long();
- float &get_float();
- std::string &get_string();
- coord_def &get_coord();
- CrawlHashTable &get_table();
- CrawlVector &get_vector();
- item_def &get_item();
-
- bool get_bool() const;
- char get_byte() const;
- short get_short() const;
- long get_long() const;
- float get_float() const;
- std::string get_string() const;
- coord_def get_coord() const;
-
- const CrawlHashTable& get_table() const;
- const CrawlVector& get_vector() const;
- const item_def& get_item() const;
-
- void set_bool(const bool val);
- void set_byte(const char val);
- void set_short(const short val);
- void set_long(const long val);
- void set_float(const float val);
- void set_string(const std::string &val);
- void set_coord(const coord_def &val);
- void set_table(const CrawlHashTable &val);
- void set_vector(const CrawlVector &val);
- void set_item(const item_def &val);
-
-public:
- // NOTE: All operators will assert if the value is of the wrong
- // type for the operation. If the value has no type yet, the
- // operation will set it to the appropriate type. If the value
- // has no type yet and the operation modifies the existing value
- // rather than replacing it (e.g., ++) the value will be set to a
- // default before the operation is done.
-
- // If the value is a hash table or vector, the container's values
- // can be accessed with the [] operator with the approriate key
- // type (strings for hashes, longs for vectors).
- CrawlStoreValue &operator [] (const std::string &key);
- CrawlStoreValue &operator [] (const vec_size &index);
-
- const CrawlStoreValue &operator [] (const std::string &key) const;
- const CrawlStoreValue &operator [] (const vec_size &index) const;
-
- // Typecast operators
- &operator bool();
- &operator char();
- &operator short();
- &operator long();
- &operator float();
- &operator std::string();
- &operator coord_def();
- &operator CrawlHashTable();
- &operator CrawlVector();
- &operator item_def();
-
- operator bool() const;
- operator char() const;
- operator short() const;
- operator long() const;
- operator float() const;
- operator std::string() const;
- operator coord_def() const;
-
- // Assignment operators
- CrawlStoreValue &operator = (const bool &val);
- CrawlStoreValue &operator = (const char &val);
- CrawlStoreValue &operator = (const short &val);
- CrawlStoreValue &operator = (const long &val);
- CrawlStoreValue &operator = (const float &val);
- CrawlStoreValue &operator = (const std::string &val);
- CrawlStoreValue &operator = (const char* val);
- CrawlStoreValue &operator = (const coord_def &val);
- CrawlStoreValue &operator = (const CrawlHashTable &val);
- CrawlStoreValue &operator = (const CrawlVector &val);
- CrawlStoreValue &operator = (const item_def &val);
-
- // Misc operators
- std::string &operator += (const std::string &val);
-
- // Prefix
- long operator ++ ();
- long operator -- ();
-
- // Postfix
- long operator ++ (int);
- long operator -- (int);
-
-protected:
- CrawlStoreValue(const store_flags flags,
- const store_val_type type = SV_NONE);
-
- void write(tagHeader &th) const;
- void read(tagHeader &th);
-
- void unset(bool force = false);
-
- friend class CrawlHashTable;
- friend class CrawlVector;
-};
-
-
-// A hash table can have a maximum of 255 key/value pairs. If you
-// want more than that you can use nested hash tables.
-//
-// By default a hash table's value data types are heterogeneous. To
-// make it homogeneous (which causes dynamic type checking) you have
-// to give a type to the hash table constructor; once it's been
-// created its type (or lack of type) is immutable.
-//
-// An empty hash table will take up only 1 byte in the savefile. A
-// non-empty hash table will have an overhead of 3 bytes for the hash
-// table overall and 2 bytes per key/value pair, over and above the
-// number of bytes needed to store the keys and values themselves.
-class CrawlHashTable
-{
-public:
- CrawlHashTable();
- CrawlHashTable(store_flags flags);
- CrawlHashTable(store_val_type type, store_flags flags = 0);
-
- ~CrawlHashTable();
-
- typedef std::map<std::string, CrawlStoreValue> hash_map_type;
- typedef hash_map_type::iterator iterator;
- typedef hash_map_type::const_iterator const_iterator;
-
-protected:
- store_val_type type;
- store_flags default_flags;
- hash_map_type hash_map;
-
- friend class CrawlStoreValue;
-
-public:
- void write(tagHeader &th) const;
- void read(tagHeader &th);
-
- store_flags get_default_flags() const;
- store_flags set_default_flags(store_flags flags);
- store_flags unset_default_flags(store_flags flags);
- store_val_type get_type() const;
- bool exists(const std::string key) const;
- void assert_validity() const;
-
- // NOTE: If the const versions of get_value() or [] are given a
- // key which doesn't exist, they will assert.
- const CrawlStoreValue& get_value(const std::string &key) const;
- const CrawlStoreValue& operator[] (const std::string &key) const;
-
- // NOTE: If get_value() or [] is given a key which doesn't exist
- // in the table, an unset/empty CrawlStoreValue will be created
- // with that key and returned. If it is not then given a value
- // then the next call to assert_validity() will fail. If the
- // hash table has a type (rather than being heterogeneous)
- // then trying to assign a different type to the CrawlStoreValue
- // will assert.
- CrawlStoreValue& get_value(const std::string &key);
- CrawlStoreValue& operator[] (const std::string &key);
-
- // std::map style interface
- hash_size size() const;
- bool empty() const;
-
- void erase(const std::string key);
- void clear();
-
- const_iterator begin() const;
- const_iterator end() const;
-
- iterator begin();
- iterator end();
-};
-
-// A CrawlVector is the vector version of CrawlHashTable, except that
-// a non-empty CrawlVector has one more byte of savefile overhead that
-// a hash table, and that can specify a maximum size to make it act
-// similarly to a FixedVec.
-class CrawlVector
-{
-public:
- CrawlVector();
- CrawlVector(store_flags flags, vec_size max_size = VEC_MAX_SIZE);
- CrawlVector(store_val_type type, store_flags flags = 0,
- vec_size max_size = VEC_MAX_SIZE);
-
- ~CrawlVector();
-
- typedef std::vector<CrawlStoreValue> vector_type;
- typedef vector_type::iterator iterator;
- typedef vector_type::const_iterator const_iterator;
-
-protected:
- store_val_type type;
- store_flags default_flags;
- vec_size max_size;
- vector_type vector;
-
- friend class CrawlStoreValue;
-
-public:
- void write(tagHeader &th) const;
- void read(tagHeader &th);
-
- store_flags get_default_flags() const;
- store_flags set_default_flags(store_flags flags);
- store_flags unset_default_flags(store_flags flags);
- store_val_type get_type() const;
- void assert_validity() const;
- void set_max_size(vec_size size);
- vec_size get_max_size() const;
-
- // NOTE: If the const versions of get_value() or [] are given a
- // index which doesn't exist, they will assert.
- const CrawlStoreValue& get_value(const vec_size &index) const;
- const CrawlStoreValue& operator[] (const vec_size &index) const;
-
- CrawlStoreValue& get_value(const vec_size &index);
- CrawlStoreValue& operator[] (const vec_size &index);
-
- // std::vector style interface
- vec_size size() const;
- bool empty() const;
-
- // NOTE: push_back() and insert() have val passed by value rather
- // than by reference so that conversion constructors will work.
- CrawlStoreValue& pop_back();
- void push_back(CrawlStoreValue val);
- void insert(const vec_size index, CrawlStoreValue val);
-
- // resize() will assert if the maximum size has been set.
- void resize(const vec_size size);
- void erase(const vec_size index);
- void clear();
-
- const_iterator begin() const;
- const_iterator end() const;
-
- iterator begin();
- iterator end();
-};
-
-// A wrapper for non-heterogeneous hash tables, so that the values can
-// be accessed without using get_foo(). T needs to have both normal
-// and const type-cast operators defined by CrawlStoreValue for this
-// template to work.
-template <typename T, store_val_type TYPE>
-class CrawlTableWrapper
-{
-public:
- CrawlTableWrapper();
- CrawlTableWrapper(CrawlHashTable& table);
- CrawlTableWrapper(CrawlHashTable* table);
-
-protected:
- CrawlHashTable* table;
-
-public:
- void wrap(CrawlHashTable& table);
- void wrap(CrawlHashTable* table);
-
- const CrawlHashTable* get_table() const;
- const T operator[] (const std::string &key) const;
-
- CrawlHashTable* get_table();
- T& operator[] (const std::string &key);
-};
-
-typedef CrawlTableWrapper<bool, SV_BOOL> CrawlBoolTable;
-typedef CrawlTableWrapper<char, SV_BYTE> CrawlByteTable;
-typedef CrawlTableWrapper<short, SV_SHORT> CrawlShortTable;
-typedef CrawlTableWrapper<long, SV_LONG> CrawlLongTable;
-typedef CrawlTableWrapper<float, SV_FLOAT> CrawlFloatTable;
-typedef CrawlTableWrapper<std::string, SV_STR> CrawlStringTable;
-typedef CrawlTableWrapper<coord_def, SV_COORD> CrawlCoordTable;
-
-#endif