#ifndef STORE_H
#define STORE_H
#include <limits.h>
#include <map>
#include <string>
#include <vector>
class reader;
class writer;
class CrawlHashTable;
class CrawlVector;
struct item_def;
struct coord_def;
struct level_pos;
class level_id;
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
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,
SV_LEV_ID,
SV_LEV_POS,
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)
};
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();
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);
CrawlStoreValue(const level_id &val);
CrawlStoreValue(const level_pos &val);
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();
level_id &get_level_id();
level_pos &get_level_pos();
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;
level_id get_level_id() const;
level_pos get_level_pos() const;
const CrawlHashTable& get_table() const;
const CrawlVector& get_vector() const;
const item_def& get_item() const;
#if 0#endif
public:
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;
#ifdef TARGET_COMPILER_VC
operator bool&();
operator char&();
operator short&();
operator long&();
operator float&();
operator std::string&();
operator coord_def&();
operator CrawlHashTable&();
operator CrawlVector&();
operator item_def&();
operator level_id&();
operator level_pos&();
#else
&operator bool();
&operator char();
&operator short();
&operator long();
&operator float();
&operator std::string();
&operator coord_def();
&operator CrawlHashTable();
&operator CrawlVector();
&operator item_def();
&operator level_id();
&operator level_pos();
#endif
operator bool() const;
operator char() const;
operator short() const;
operator long() const;
operator float() const;
operator std::string() const;
operator coord_def() const;
operator level_id() const;
operator level_pos() const;
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);
CrawlStoreValue &operator = (const level_id &val);
CrawlStoreValue &operator = (const level_pos &val);
std::string &operator += (const std::string &val);
long operator ++ ();
long operator -- ();
long operator ++ (int);
long operator -- (int);
protected:
CrawlStoreValue(const store_flags flags,
const store_val_type type = SV_NONE);
void write(writer &) const;
void read(reader &);
void unset(bool force = false);
friend class CrawlHashTable;
friend class CrawlVector;
};
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(writer &) const;
void read(reader &);
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;
const CrawlStoreValue& get_value(const std::string &key) const;
const CrawlStoreValue& operator[] (const std::string &key) const;
CrawlStoreValue& get_value(const std::string &key);
CrawlStoreValue& operator[] (const std::string &key);
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();
};
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(writer &) const;
void read(reader &);
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;
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);
vec_size size() const;
bool empty() const;
CrawlStoreValue& pop_back();
void push_back(CrawlStoreValue val);
void insert(const vec_size index, CrawlStoreValue val);
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();
};
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