From: <vo...@us...> - 2008-09-17 13:33:16
|
Revision: 836 http://opde.svn.sourceforge.net/opde/?rev=836&view=rev Author: volca Date: 2008-09-17 13:33:26 +0000 (Wed, 17 Sep 2008) Log Message: ----------- moving PropertyStorage to dyntype - it is becoming a common ancestor to data storage classes Added Paths: ----------- trunk/src/base/dyntype/PropertyStorage.cpp trunk/src/base/dyntype/PropertyStorage.h Removed Paths: ------------- trunk/src/services/property/PropertyStorage.cpp trunk/src/services/property/PropertyStorage.h Copied: trunk/src/base/dyntype/PropertyStorage.cpp (from rev 830, trunk/src/services/property/PropertyStorage.cpp) =================================================================== --- trunk/src/base/dyntype/PropertyStorage.cpp (rev 0) +++ trunk/src/base/dyntype/PropertyStorage.cpp 2008-09-17 13:33:26 UTC (rev 836) @@ -0,0 +1,434 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * $Id$ + * + *****************************************************************************/ + +#include "PropertyStorage.h" +#include "logger.h" + +using namespace std; + +namespace Opde { + // -------------------------------------------------------------------------- + // --------------- Various utility classes ---------------------------------- + // -------------------------------------------------------------------------- + DTypeDefFieldDesc::DTypeDefFieldDesc(const DTypeDefPtr& type) { + // prepare the list + DTypeDef::const_iterator it = type->begin(); + + while (it != type->end()) { + const DTypeDef::FieldDef& fd = *(it++); + + DataFieldDesc dfd; + dfd.name = fd.name; + dfd.size = fd.type->size(); + dfd.type = fd.type->getDataType(); + dfd.enumerator = fd.type->getEnum().ptr(); + + mDataFieldDescList.push_back(dfd); + } + } + + DataFieldDescIteratorPtr DTypeDefFieldDesc::getIterator() { + return new DataFieldDescListIterator(mDataFieldDescList); + } + + /// iterator over a single DataFieldDesc element. Useful for single-fielded properties, such as varstr properties + class SingleFieldDescIterator : public DataFieldDescIterator { + public: + SingleFieldDescIterator(const DataFieldDesc& desc) : mDesc(desc), mEnd(false) {}; + + virtual const DataFieldDesc& next() { assert(!mEnd); mEnd = true; return mDesc; }; + + virtual bool end() const { std::cerr << "SFDI " << this << " " << mEnd << std::endl; return mEnd; }; + + protected: + const DataFieldDesc& mDesc; + bool mEnd; + }; + + // -------------------------------------------------------------------------- + // --------------- Structured Data Storage (DType based) -------------------- + // -------------------------------------------------------------------------- + + StructuredDataStorage::StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache) : + mTypeDef(type), + mUseDataCache(useDataCache), + mFieldDesc(type) { + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::isEmpty() { + return mDataMap.empty(); + } + + // -------------------------------------------------------------------------- + void StructuredDataStorage::clear() { + mDataMap.clear(); + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { + DTypePtr pd = getDataForObject(objID); + + if (pd.isNull()) { + uint32_t size; + + // Read the size + if (sizeStored) + file->readElem(&size, sizeof(uint32_t)); + else + size = mTypeDef->size(); + + // compare sizes + if (size != mTypeDef->size()) + LOG_ERROR("Data size mismatch: %d definition, %d file source", mTypeDef->size(), size); + + // create a new data + pd = _create(objID); + + pd->read(file, size); + + mDataMap.insert(std::make_pair(objID, pd)); + + return true; + } else { + // still have to at least skip the data + uint32_t size; + + // Read the size + file->readElem(&size, sizeof(uint32_t)); + + file->seek(size, File::FSEEK_CUR); + + LOG_ERROR("Data already defined for object %d", objID); + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { + DTypePtr pd = getDataForObject(objID); + + if (!pd.isNull()) { + uint32_t size = pd->size(); + + // Write the size + if (sizeStored) + file->writeElem(&size, sizeof(uint32_t)); + + // write the data itself + pd->serialize(file); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::setField(int objID, const std::string& field, const DVariant& value) { + DTypePtr pd = getDataForObject(objID); + + if (!pd.isNull()) { + // delegate to pd to set the field + pd->set(field, value); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::getField(int objID, const std::string& field, DVariant& target) { + DTypePtr pd = getDataForObject(objID); + + if (!pd.isNull()) { + // delegate to pd to get the field val. + // TODO: Faster using a pass by reference construct? + target = pd->get(field); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::has(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + return (it != mDataMap.end()); + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::clone(int srcID, int dstID) { + // clone prop data + if (!has(srcID) || has(dstID)) + return false; + + DTypePtr pd = getDataForObject(srcID); + + DTypePtr nd = new DType(*pd, mUseDataCache); + + // insert into map for the new object + std::pair<DataMap::iterator, bool> res = mDataMap.insert(std::make_pair(dstID, nd)); + + return res.second; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::destroy(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + mDataMap.erase(it); + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::create(int objID) { + return !(_create(objID).isNull()); + } + + // -------------------------------------------------------------------------- + DTypePtr StructuredDataStorage::_create(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it == mDataMap.end()) { + DTypePtr propd = new DType(mTypeDef, mUseDataCache); + + mDataMap.insert(std::make_pair(objID, propd)); + + return propd; + } + + return it->second; + } + + // -------------------------------------------------------------------------- + IntIteratorPtr StructuredDataStorage::getAllStoredObjects() { + return new DataKeyIterator(mDataMap); + } + + // -------------------------------------------------------------------------- + DTypePtr StructuredDataStorage::getDataForObject(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + return it->second; + } else { + return NULL; + } + } + + // -------------------------------------------------------------------------- + DataFieldDescIteratorPtr StructuredDataStorage::getFieldDescIterator(void) { + // return our pre-prepared field desc iterator + return mFieldDesc.getIterator(); + } + + // -------------------------------------------------------------------------- + // --------------- String Data Storage -------------------------------------- + // -------------------------------------------------------------------------- + StringDataStorage::StringDataStorage() { + mFieldDesc.enumerator = NULL; + mFieldDesc.name = ""; + mFieldDesc.size = -1; + mFieldDesc.type = DVariant::DV_STRING; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::create(int objID) { + return _create(objID, ""); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::destroy(int objID) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + mStringPropMap.erase(it); + + // true, erase went ok + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::has(int objID) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + return (it != mStringPropMap.end()); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::clone(int srcID, int dstID) { + StringDataMap::iterator it = mStringPropMap.find(srcID); + + if (it != mStringPropMap.end()) { + std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(dstID, it->second)); + + return res.second; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::getField(int objID, const std::string& field, DVariant& target) { + assert(field==""); + + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + target = it->second; + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::setField(int objID, const std::string& field, const DVariant& value) { + assert(field==""); + + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + it->second = value.toString(); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + const std::string& str = it->second; + + uint32_t size = str.size(); + uint32_t outer_size = size + sizeof(uint32_t); + + // Write the size (first size is the size of the string + 4 bytes of the internal size) + if (sizeStored) + file->writeElem(&outer_size, sizeof(uint32_t)); + + file->writeElem(&size, sizeof(uint32_t)); + + // write the data itself + file->write(str.c_str(), size); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it == mStringPropMap.end()) { + uint32_t outer_size, size; + + if (sizeStored) + file->readElem(&outer_size, sizeof(uint32_t)); + + file->readElem(&size, sizeof(uint32_t)); + + if (!sizeStored) + outer_size = size - sizeof(uint32_t); + + assert(outer_size == (size + sizeof(uint32_t))); + + // prepare the string temp buffer + char* str = new char[size + 1]; + + str[size] = 0; // terminate to be sure + + file->read(str, size); + + std::string sobj(str); + + _create(objID, sobj); + + delete[] str; + + return true; + } else { + // skip the prop... + uint32_t size; + + file->readElem(&size, sizeof(uint32_t)); + file->seek(size, File::FSEEK_CUR); + + LOG_ERROR("Data (str) already defined for object %d", objID); + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::_create(int objID, const std::string& text) { + std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(objID, text)); + + return res.second; + } + + // -------------------------------------------------------------------------- + void StringDataStorage::clear() { + mStringPropMap.clear(); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::isEmpty() { + return mStringPropMap.empty(); + } + + // -------------------------------------------------------------------------- + IntIteratorPtr StringDataStorage::getAllStoredObjects() { + return new StringDataMapKeyIterator(mStringPropMap); + } + + // -------------------------------------------------------------------------- + DataFieldDescIteratorPtr StringDataStorage::getFieldDescIterator(void) { + return new SingleFieldDescIterator(mFieldDesc); + } + + // -------------------------------------------------------------------------- + // --------------- Bool Data Storage ---------------------------------------- + // -------------------------------------------------------------------------- + +} Copied: trunk/src/base/dyntype/PropertyStorage.h (from rev 835, trunk/src/services/property/PropertyStorage.h) =================================================================== --- trunk/src/base/dyntype/PropertyStorage.h (rev 0) +++ trunk/src/base/dyntype/PropertyStorage.h 2008-09-17 13:33:26 UTC (rev 836) @@ -0,0 +1,345 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + + +#ifndef __DATASTORAGE_H +#define __DATASTORAGE_H + +#include "config.h" + +#include "DTypeDef.h" +#include "DVariant.h" +#include "File.h" +#include "Iterator.h" + +namespace Opde { + /** @brief Storage for data (Interface). This class is used as a backend for either property or link storage, and provides data these classes. + * This storage can be overriden to suit better for particular data handling to be managed in effective/different manner for example. + * @note This class does no inheritance resolving itself (in case of properties). Only stores data. + * @note The objID, object id referenced here has the meaning of a ID of any kind appropriate - game object id for Properties, Link id for links. + */ + class OPDELIB_EXPORT DataStorage { + public: + virtual ~DataStorage() {}; + + /** Creates a default-value data for object numbered objID + * @param objID The object ID + * @return true if creation wen't ok, false if something went wrong (object already has the data attached) + */ + virtual bool create(int objID) = 0; + + /** Destroys data on a defined object + * @param objID the object to destroy the data for + * @return true if data was destroyed, false if something went wrong (data was not assigned to the object) + */ + virtual bool destroy(int objID) = 0; + + /** Data ownership detector. Returns true if this data storage holds data for the given object ID + */ + virtual bool has(int objID) = 0; + + /** Clones the data to another object ID (copies all values) + * @note The target data has to not exit (this routine does not overwrite) + * @param srcID the source object ID + * @param dstID the destination ID + * @return true if all went ok, false otherwise (srcID invalid, dstID invalid...) + */ + virtual bool clone(int srcID, int dstID) = 0; + + /** Field value getter + * @param objID The object id to get data value for + * @param field The field to get value for + * @param target The target variant to fill with value + * @return true if value was set to target, false if the field was invalid + */ + virtual bool getField(int objID, const std::string& field, DVariant& target) = 0; + + /** Field value setter + * @param objID The object id to set data value for + * @param field The field to set value for + * @param value The new value to use + * @return true if value was set to target, false if the field was invalid + */ + virtual bool setField(int objID, const std::string& field, const DVariant& value) = 0; + + /** Serialization core routine + * This routine is used to serialize the data for given object ID into a File handle. + * Normally, this routine should write data for the stored data in this format: + * @code + * 32-bit unnsigned size (N) - only expected/written if sizeStored is true + * N bytes of data data for the given property + * @endcode + * + * @param file The file to store the data into + * @param objID The id of the object data to write + * @param sizeStored if true, the size is stored with the data + */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored) = 0; + + /** Deserialization core routine + * This routine is used to read property data for a given object id from a given File handle. + * Normally, this format format is used: + * @code + * 32-bit unnsigned size (N) - only expected/written if sizeStored is true + * N bytes of Property data for the given property + * @endcode + * @note This routine automatically creates property data slot for the objID, and does no load over any previous data (so clear before load is encouraged) + * + * @param file The file to read the data from + * @param objID The id of the object data to read + * @param sizeStored if true, the size is stored with the data, and is read before the data. Otherwise the size of the date this storage uses is used + */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored) = 0; + + /** Called to clear all data */ + virtual void clear() = 0; + + /** Emptyness of data storage detector + * @return true If the data storage does not hold any data, false if does */ + virtual bool isEmpty() = 0; + + /** Getter for all stored object ID's + */ + virtual IntIteratorPtr getAllStoredObjects() = 0; + + /** Optional handler for object ID range re-sets (f.e. when growing the concretes) + */ + virtual void setIDRange(int minID, int MaxID) { }; + + /** Data description retrieval routine. Can be used to generate GUI for data editor, etc. + * @return The data fields description iterator, preferably in the order sored + */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void) = 0; + }; + + /// Shared pointer to data storage + typedef shared_ptr<DataStorage> DataStoragePtr; + + /// Internal: Implementation of field desc. for iterator over DTypeDef + class OPDELIB_EXPORT DTypeDefFieldDesc { + public: + DTypeDefFieldDesc(const DTypeDefPtr& type); + + DataFieldDescIteratorPtr getIterator(); + + protected: + DataFieldDescList mDataFieldDescList; + }; + + /** Structured data implementation of the DataStorage. */ + class OPDELIB_EXPORT StructuredDataStorage : public DataStorage { + public: + StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache); + + /** @see DataStorage::createProp */ + virtual bool create(int objID); + + /** @see DataStorage::destroyProp */ + virtual bool destroy(int objID); + + /** @see DataStorage::hasProp */ + virtual bool has(int objID); + + /** @see DataStorage::cloneProp */ + virtual bool clone(int srcID, int dstID); + + /** @see DataStorage::getPropField */ + virtual bool getField(int objID, const std::string& field, DVariant& target); + + /** @see DataStorage::setPropField */ + virtual bool setField(int objID, const std::string& field, const DVariant& value); + + /** @see DataStorage::writeToFile */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::readFromFile */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::clear */ + virtual void clear(); + + /** @see DataStorage::isEmpty */ + virtual bool isEmpty(); + + /** @see DataStorage::getAllStoredObjects */ + virtual IntIteratorPtr getAllStoredObjects(); + + /** @see DataStorage::getFieldDescIterator */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void); + + protected: + + /** core data creation routine. Returns a pointer to newly created or already existed data data for the objID */ + virtual DTypePtr _create(int objID); + + /// Internal getter for data + DTypePtr getDataForObject(int objID); + + /// Stores objectID -> Data + typedef std::map< int, DTypePtr > DataMap; + + /// Data store instance + DataMap mDataMap; + + /// Type definition for the stored properties + DTypeDefPtr mTypeDef; + + /// Data cache usage indicator (field conversion speedup) + bool mUseDataCache; + + typedef MapKeyIterator<DataMap, int> DataKeyIterator; + + class EmptyIntIterator : public IntIterator { + public: + EmptyIntIterator() : mZero(0) {}; + + const int& next() { + assert(false); + + return mZero; + }; + + bool end() const { + return true; + }; + + protected: + int mZero; + }; + + /// Field description pre-prepared iterator + DTypeDefFieldDesc mFieldDesc; + }; + + + /** Data storage targetted at storing variable length strings (One per id). */ + class OPDELIB_EXPORT StringDataStorage : public DataStorage { + public: + StringDataStorage(); + + protected: + /** @see DataStorage::createProp */ + virtual bool create(int objID); + + /** @see DataStorage::destroyProp */ + virtual bool destroy(int objID); + + /** @see DataStorage::hasProp */ + virtual bool has(int objID); + + /** @see DataStorage::cloneProp */ + virtual bool clone(int srcID, int dstID); + + /** @see DataStorage::getPropField */ + virtual bool getField(int objID, const std::string& field, DVariant& target); + + /** @see DataStorage::setPropField */ + virtual bool setField(int objID, const std::string& field, const DVariant& value); + + /** @see DataStorage::writeToFile */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::readFromFile */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::clear */ + virtual void clear(); + + /** @see DataStorage::isEmpty */ + virtual bool isEmpty(); + + /** @see DataStorage::getAllStoredObjects */ + virtual IntIteratorPtr getAllStoredObjects(); + + /** Core Data creation routine */ + virtual bool _create(int objID, const std::string& text); + + /** @see DataStorage::getFieldDescIterator */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void); + + /// String Data map + typedef std::map<int, std::string> StringDataMap; + + /// Holder of data (string) values + StringDataMap mStringPropMap; + + /// String prop. storage is a single-field construct. This is the field desc for the field + DataFieldDesc mFieldDesc; + + typedef MapKeyIterator<StringDataMap, int> StringDataMapKeyIterator; + }; + +// +// /// Bool property store. Stores 1 bool per object id in a packed array +// class BoolPropertyStorage : public PropertyStorage { +// public: +// BoolPropertyStorage(); +// ~BoolPropertyStorage(); +// +// protected: +// /** @see PropertyStorage::createProp */ +// virtual bool createProp(int objID); +// +// /** @see PropertyStorage::destroyProp */ +// virtual bool destroyProp(int objID); +// +// /** @see PropertyStorage::hasProp */ +// virtual bool hasProp(int objID); +// +// /** @see PropertyStorage::cloneProp */ +// virtual bool cloneProp(int srcID, int dstID); +// +// /** @see PropertyStorage::getPropField */ +// virtual bool getPropField(int objID, const std::string& field, DVariant& target); +// +// /** @see PropertyStorage::setPropField */ +// virtual bool setPropField(int objID, const std::string& field, const DVariant& value); +// +// /** @see PropertyStorage::writeToFile */ +// virtual bool writeToFile(FilePtr& file, int objID); +// +// /** @see PropertyStorage::readFromFile */ +// virtual bool readFromFile(FilePtr& file, int objID); +// +// /** @see PropertyStorage::clear */ +// virtual void clear(); +// +// /** @see PropertyStorage::isEmpty */ +// virtual bool isEmpty(); +// +// /** @see PropertyStorage::getAllStoredObjects */ +// virtual BitArrayIteratorPtr getAllStoredObjects(); +// +// /// Handles the growth of the object ID range on the bitarrays +// virtual void setIDRange(int minID, int MaxID); +// +// /// mask of stored objects +// BitArray mMask; +// +// /// True/False storage for the objects +// BitArray mValues; +// } + +} + +#endif // __PROPERTYSTORAGE_H Deleted: trunk/src/services/property/PropertyStorage.cpp =================================================================== --- trunk/src/services/property/PropertyStorage.cpp 2008-09-17 13:31:37 UTC (rev 835) +++ trunk/src/services/property/PropertyStorage.cpp 2008-09-17 13:33:26 UTC (rev 836) @@ -1,434 +0,0 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * - * $Id$ - * - *****************************************************************************/ - -#include "PropertyStorage.h" -#include "logger.h" - -using namespace std; - -namespace Opde { - // -------------------------------------------------------------------------- - // --------------- Various utility classes ---------------------------------- - // -------------------------------------------------------------------------- - DTypeDefFieldDesc::DTypeDefFieldDesc(const DTypeDefPtr& type) { - // prepare the list - DTypeDef::const_iterator it = type->begin(); - - while (it != type->end()) { - const DTypeDef::FieldDef& fd = *(it++); - - DataFieldDesc dfd; - dfd.name = fd.name; - dfd.size = fd.type->size(); - dfd.type = fd.type->getDataType(); - dfd.enumerator = fd.type->getEnum().ptr(); - - mDataFieldDescList.push_back(dfd); - } - } - - DataFieldDescIteratorPtr DTypeDefFieldDesc::getIterator() { - return new DataFieldDescListIterator(mDataFieldDescList); - } - - /// iterator over a single DataFieldDesc element. Useful for single-fielded properties, such as varstr properties - class SingleFieldDescIterator : public DataFieldDescIterator { - public: - SingleFieldDescIterator(const DataFieldDesc& desc) : mDesc(desc), mEnd(false) {}; - - virtual const DataFieldDesc& next() { assert(!mEnd); mEnd = true; return mDesc; }; - - virtual bool end() const { std::cerr << "SFDI " << this << " " << mEnd << std::endl; return mEnd; }; - - protected: - const DataFieldDesc& mDesc; - bool mEnd; - }; - - // -------------------------------------------------------------------------- - // --------------- Structured Data Storage (DType based) -------------------- - // -------------------------------------------------------------------------- - - StructuredDataStorage::StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache) : - mTypeDef(type), - mUseDataCache(useDataCache), - mFieldDesc(type) { - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::isEmpty() { - return mDataMap.empty(); - } - - // -------------------------------------------------------------------------- - void StructuredDataStorage::clear() { - mDataMap.clear(); - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { - DTypePtr pd = getDataForObject(objID); - - if (pd.isNull()) { - uint32_t size; - - // Read the size - if (sizeStored) - file->readElem(&size, sizeof(uint32_t)); - else - size = mTypeDef->size(); - - // compare sizes - if (size != mTypeDef->size()) - LOG_ERROR("Data size mismatch: %d definition, %d file source", mTypeDef->size(), size); - - // create a new data - pd = _create(objID); - - pd->read(file, size); - - mDataMap.insert(std::make_pair(objID, pd)); - - return true; - } else { - // still have to at least skip the data - uint32_t size; - - // Read the size - file->readElem(&size, sizeof(uint32_t)); - - file->seek(size, File::FSEEK_CUR); - - LOG_ERROR("Data already defined for object %d", objID); - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { - DTypePtr pd = getDataForObject(objID); - - if (!pd.isNull()) { - uint32_t size = pd->size(); - - // Write the size - if (sizeStored) - file->writeElem(&size, sizeof(uint32_t)); - - // write the data itself - pd->serialize(file); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::setField(int objID, const std::string& field, const DVariant& value) { - DTypePtr pd = getDataForObject(objID); - - if (!pd.isNull()) { - // delegate to pd to set the field - pd->set(field, value); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::getField(int objID, const std::string& field, DVariant& target) { - DTypePtr pd = getDataForObject(objID); - - if (!pd.isNull()) { - // delegate to pd to get the field val. - // TODO: Faster using a pass by reference construct? - target = pd->get(field); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::has(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - return (it != mDataMap.end()); - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::clone(int srcID, int dstID) { - // clone prop data - if (!has(srcID) || has(dstID)) - return false; - - DTypePtr pd = getDataForObject(srcID); - - DTypePtr nd = new DType(*pd, mUseDataCache); - - // insert into map for the new object - std::pair<DataMap::iterator, bool> res = mDataMap.insert(std::make_pair(dstID, nd)); - - return res.second; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::destroy(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it != mDataMap.end()) { - mDataMap.erase(it); - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::create(int objID) { - return !(_create(objID).isNull()); - } - - // -------------------------------------------------------------------------- - DTypePtr StructuredDataStorage::_create(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it == mDataMap.end()) { - DTypePtr propd = new DType(mTypeDef, mUseDataCache); - - mDataMap.insert(std::make_pair(objID, propd)); - - return propd; - } - - return it->second; - } - - // -------------------------------------------------------------------------- - IntIteratorPtr StructuredDataStorage::getAllStoredObjects() { - return new DataKeyIterator(mDataMap); - } - - // -------------------------------------------------------------------------- - DTypePtr StructuredDataStorage::getDataForObject(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it != mDataMap.end()) { - return it->second; - } else { - return NULL; - } - } - - // -------------------------------------------------------------------------- - DataFieldDescIteratorPtr StructuredDataStorage::getFieldDescIterator(void) { - // return our pre-prepared field desc iterator - return mFieldDesc.getIterator(); - } - - // -------------------------------------------------------------------------- - // --------------- String Data Storage -------------------------------------- - // -------------------------------------------------------------------------- - StringDataStorage::StringDataStorage() { - mFieldDesc.enumerator = NULL; - mFieldDesc.name = ""; - mFieldDesc.size = -1; - mFieldDesc.type = DVariant::DV_STRING; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::create(int objID) { - return _create(objID, ""); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::destroy(int objID) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - mStringPropMap.erase(it); - - // true, erase went ok - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::has(int objID) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - return (it != mStringPropMap.end()); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::clone(int srcID, int dstID) { - StringDataMap::iterator it = mStringPropMap.find(srcID); - - if (it != mStringPropMap.end()) { - std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(dstID, it->second)); - - return res.second; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::getField(int objID, const std::string& field, DVariant& target) { - assert(field==""); - - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - target = it->second; - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::setField(int objID, const std::string& field, const DVariant& value) { - assert(field==""); - - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - it->second = value.toString(); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - const std::string& str = it->second; - - uint32_t size = str.size(); - uint32_t outer_size = size + sizeof(uint32_t); - - // Write the size (first size is the size of the string + 4 bytes of the internal size) - if (sizeStored) - file->writeElem(&outer_size, sizeof(uint32_t)); - - file->writeElem(&size, sizeof(uint32_t)); - - // write the data itself - file->write(str.c_str(), size); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it == mStringPropMap.end()) { - uint32_t outer_size, size; - - if (sizeStored) - file->readElem(&outer_size, sizeof(uint32_t)); - - file->readElem(&size, sizeof(uint32_t)); - - if (!sizeStored) - outer_size = size - sizeof(uint32_t); - - assert(outer_size == (size + sizeof(uint32_t))); - - // prepare the string temp buffer - char* str = new char[size + 1]; - - str[size] = 0; // terminate to be sure - - file->read(str, size); - - std::string sobj(str); - - _create(objID, sobj); - - delete[] str; - - return true; - } else { - // skip the prop... - uint32_t size; - - file->readElem(&size, sizeof(uint32_t)); - file->seek(size, File::FSEEK_CUR); - - LOG_ERROR("Data (str) already defined for object %d", objID); - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::_create(int objID, const std::string& text) { - std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(objID, text)); - - return res.second; - } - - // -------------------------------------------------------------------------- - void StringDataStorage::clear() { - mStringPropMap.clear(); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::isEmpty() { - return mStringPropMap.empty(); - } - - // -------------------------------------------------------------------------- - IntIteratorPtr StringDataStorage::getAllStoredObjects() { - return new StringDataMapKeyIterator(mStringPropMap); - } - - // -------------------------------------------------------------------------- - DataFieldDescIteratorPtr StringDataStorage::getFieldDescIterator(void) { - return new SingleFieldDescIterator(mFieldDesc); - } - - // -------------------------------------------------------------------------- - // --------------- Bool Data Storage ---------------------------------------- - // -------------------------------------------------------------------------- - -} Deleted: trunk/src/services/property/PropertyStorage.h =================================================================== --- trunk/src/services/property/PropertyStorage.h 2008-09-17 13:31:37 UTC (rev 835) +++ trunk/src/services/property/PropertyStorage.h 2008-09-17 13:33:26 UTC (rev 836) @@ -1,345 +0,0 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - * - *****************************************************************************/ - - -#ifndef __DATASTORAGE_H -#define __DATASTORAGE_H - -#include "config.h" - -#include "DTypeDef.h" -#include "DVariant.h" -#include "File.h" -#include "Iterator.h" - -namespace Opde { - /** @brief Storage for data (Interface). This class is used as a backend for either property or link storage, and provides data these classes. - * This storage can be overriden to suit better for particular data handling to be managed in effective/different manner for example. - * @note This class does no inheritance resolving itself (in case of properties). Only stores data. - * @note The objID, object id referenced here has the meaning of a ID of any kind appropriate - game object id for Properties, Link id for links. - */ - class OPDELIB_EXPORT DataStorage { - public: - virtual ~DataStorage() {}; - - /** Creates a default-value data for object numbered objID - * @param objID The object ID - * @return true if creation wen't ok, false if something went wrong (object already has the data attached) - */ - virtual bool create(int objID) = 0; - - /** Destroys data on a defined object - * @param objID the object to destroy the data for - * @return true if data was destroyed, false if something went wrong (data was not assigned to the object) - */ - virtual bool destroy(int objID) = 0; - - /** Data ownership detector. Returns true if this data storage holds data for the given object ID - */ - virtual bool has(int objID) = 0; - - /** Clones the data to another object ID (copies all values) - * @note The target data has to not exit (this routine does not overwrite) - * @param srcID the source object ID - * @param dstID the destination ID - * @return true if all went ok, false otherwise (srcID invalid, dstID invalid...) - */ - virtual bool clone(int srcID, int dstID) = 0; - - /** Field value getter - * @param objID The object id to get data value for - * @param field The field to get value for - * @param target The target variant to fill with value - * @return true if value was set to target, false if the field was invalid - */ - virtual bool getField(int objID, const std::string& field, DVariant& target) = 0; - - /** Field value setter - * @param objID The object id to set data value for - * @param field The field to set value for - * @param value The new value to use - * @return true if value was set to target, false if the field was invalid - */ - virtual bool setField(int objID, const std::string& field, const DVariant& value) = 0; - - /** Serialization core routine - * This routine is used to serialize the data for given object ID into a File handle. - * Normally, this routine should write data for the stored data in this format: - * @code - * 32-bit unnsigned size (N) - only expected/written if sizeStored is true - * N bytes of data data for the given property - * @endcode - * - * @param file The file to store the data into - * @param objID The id of the object data to write - * @param sizeStored if true, the size is stored with the data - */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored) = 0; - - /** Deserialization core routine - * This routine is used to read property data for a given object id from a given File handle. - * Normally, this format format is used: - * @code - * 32-bit unnsigned size (N) - only expected/written if sizeStored is true - * N bytes of Property data for the given property - * @endcode - * @note This routine automatically creates property data slot for the objID, and does no load over any previous data (so clear before load is encouraged) - * - * @param file The file to read the data from - * @param objID The id of the object data to read - * @param sizeStored if true, the size is stored with the data, and is read before the data. Otherwise the size of the date this storage uses is used - */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored) = 0; - - /** Called to clear all data */ - virtual void clear() = 0; - - /** Emptyness of data storage detector - * @return true If the data storage does not hold any data, false if does */ - virtual bool isEmpty() = 0; - - /** Getter for all stored object ID's - */ - virtual IntIteratorPtr getAllStoredObjects() = 0; - - /** Optional handler for object ID range re-sets (f.e. when growing the concretes) - */ - virtual void setIDRange(int minID, int MaxID) { }; - - /** Data description retrieval routine. Can be used to generate GUI for data editor, etc. - * @return The data fields description iterator, preferably in the order sored - */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void) = 0; - }; - - /// Shared pointer to data storage - typedef shared_ptr<DataStorage> DataStoragePtr; - - /// Internal: Implementation of field desc. for iterator over DTypeDef - class OPDELIB_EXPORT DTypeDefFieldDesc { - public: - DTypeDefFieldDesc(const DTypeDefPtr& type); - - DataFieldDescIteratorPtr getIterator(); - - protected: - DataFieldDescList mDataFieldDescList; - }; - - /** Structured data implementation of the DataStorage. */ - class OPDELIB_EXPORT StructuredDataStorage : public DataStorage { - public: - StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache); - - /** @see DataStorage::createProp */ - virtual bool create(int objID); - - /** @see DataStorage::destroyProp */ - virtual bool destroy(int objID); - - /** @see DataStorage::hasProp */ - virtual bool has(int objID); - - /** @see DataStorage::cloneProp */ - virtual bool clone(int srcID, int dstID); - - /** @see DataStorage::getPropField */ - virtual bool getField(int objID, const std::string& field, DVariant& target); - - /** @see DataStorage::setPropField */ - virtual bool setField(int objID, const std::string& field, const DVariant& value); - - /** @see DataStorage::writeToFile */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::readFromFile */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::clear */ - virtual void clear(); - - /** @see DataStorage::isEmpty */ - virtual bool isEmpty(); - - /** @see DataStorage::getAllStoredObjects */ - virtual IntIteratorPtr getAllStoredObjects(); - - /** @see DataStorage::getFieldDescIterator */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void); - - protected: - - /** core data creation routine. Returns a pointer to newly created or already existed data data for the objID */ - virtual DTypePtr _create(int objID); - - /// Internal getter for data - DTypePtr getDataForObject(int objID); - - /// Stores objectID -> Data - typedef std::map< int, DTypePtr > DataMap; - - /// Data store instance - DataMap mDataMap; - - /// Type definition for the stored properties - DTypeDefPtr mTypeDef; - - /// Data cache usage indicator (field conversion speedup) - bool mUseDataCache; - - typedef MapKeyIterator<DataMap, int> DataKeyIterator; - - class EmptyIntIterator : public IntIterator { - public: - EmptyIntIterator() : mZero(0) {}; - - const int& next() { - assert(false); - - return mZero; - }; - - bool end() const { - return true; - }; - - protected: - int mZero; - }; - - /// Field description pre-prepared iterator - DTypeDefFieldDesc mFieldDesc; - }; - - - /** Data storage targetted at storing variable length strings (One per id). */ - class OPDELIB_EXPORT StringDataStorage : public DataStorage { - public: - StringDataStorage(); - - protected: - /** @see DataStorage::createProp */ - virtual bool create(int objID); - - /** @see DataStorage::destroyProp */ - virtual bool destroy(int objID); - - /** @see DataStorage::hasProp */ - virtual bool has(int objID); - - /** @see DataStorage::cloneProp */ - virtual bool clone(int srcID, int dstID); - - /** @see DataStorage::getPropField */ - virtual bool getField(int objID, const std::string& field, DVariant& target); - - /** @see DataStorage::setPropField */ - virtual bool setField(int objID, const std::string& field, const DVariant& value); - - /** @see DataStorage::writeToFile */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::readFromFile */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::clear */ - virtual void clear(); - - /** @see DataStorage::isEmpty */ - virtual bool isEmpty(); - - /** @see DataStorage::getAllStoredObjects */ - virtual IntIteratorPtr getAllStoredObjects(); - - /** Core Data creation routine */ - virtual bool _create(int objID, const std::string& text); - - /** @see DataStorage::getFieldDescIterator */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void); - - /// String Data map - typedef std::map<int, std::string> StringDataMap; - - /// Holder of data (string) values - StringDataMap mStringPropMap; - - /// String prop. storage is a single-field construct. This is the field desc for the field - DataFieldDesc mFieldDesc; - - typedef MapKeyIterator<StringDataMap, int> StringDataMapKeyIterator; - }; - -// -// /// Bool property store. Stores 1 bool per object id in a packed array -// class BoolPropertyStorage : public PropertyStorage { -// public: -// BoolPropertyStorage(); -// ~BoolPropertyStorage(); -// -// protected: -// /** @see PropertyStorage::createProp */ -// virtual bool createProp(int objID); -// -// /** @see PropertyStorage::destroyProp */ -// virtual bool destroyProp(int objID); -// -// /** @see PropertyStorage::hasProp */ -// virtual bool hasProp(int objID); -// -// /** @see PropertyStorage::cloneProp */ -// virtual bool cloneProp(int srcID, int dstID); -// -// /** @see PropertyStorage::getPropField */ -// virtual bool getPropField(int objID, const std::string& field, DVariant& target); -// -// /** @see PropertyStorage::setPropField */ -// virtual bool setPropField(int objID, const std::string& field, const DVariant& value); -// -// /** @see PropertyStorage::writeToFile */ -// virtual bool writeToFile(FilePtr& file, int objID); -// -// /** @see PropertyStorage::readFromFile */ -// virtual bool readFromFile(FilePtr& file, int objID); -// -// /** @see PropertyStorage::clear */ -// virtual void clear(); -// -// /** @see PropertyStorage::isEmpty */ -// virtual bool isEmpty(); -// -// /** @see PropertyStorage::getAllStoredObjects */ -// virtual BitArrayIteratorPtr getAllStoredObjects(); -// -// /// Handles the growth of the object ID range on the bitarrays -// virtual void setIDRange(int minID, int MaxID); -// -// /// mask of stored objects -// BitArray mMask; -// -// /// True/False storage for the objects -// BitArray mValues; -// } - -} - -#endif // __PROPERTYSTORAGE_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |