summaryrefslogtreecommitdiff
path: root/library/include
diff options
context:
space:
mode:
authorAlexander Gavrilov2012-08-18 14:34:20 +0400
committerAlexander Gavrilov2012-08-18 14:34:20 +0400
commitc6694e386fa3a01bae34991a503b22fb4055e757 (patch)
tree8639075da1a681958c1740941951bfc42bd9bec6 /library/include
parent24cc8b5c7add7e18b6bd42eea743a9e9d562a336 (diff)
downloaddfhack-c6694e386fa3a01bae34991a503b22fb4055e757.tar.gz
dfhack-c6694e386fa3a01bae34991a503b22fb4055e757.tar.bz2
dfhack-c6694e386fa3a01bae34991a503b22fb4055e757.tar.xz
Add rather inefficient type_identity wrapping for std::set.
Accessing an element is O(N), as if it was walking a list.
Diffstat (limited to 'library/include')
-rw-r--r--library/include/DataDefs.h1
-rw-r--r--library/include/DataIdentity.h40
2 files changed, 41 insertions, 0 deletions
diff --git a/library/include/DataDefs.h b/library/include/DataDefs.h
index 7903530d..ccb29b0e 100644
--- a/library/include/DataDefs.h
+++ b/library/include/DataDefs.h
@@ -28,6 +28,7 @@ distribution.
#include <sstream>
#include <vector>
#include <map>
+#include <set>
#include "Core.h"
#include "BitArray.h"
diff --git a/library/include/DataIdentity.h b/library/include/DataIdentity.h
index dcd0ae97..0f5fd9e7 100644
--- a/library/include/DataIdentity.h
+++ b/library/include/DataIdentity.h
@@ -115,6 +115,8 @@ namespace DFHack
virtual void lua_item_read(lua_State *state, int fname_idx, void *ptr, int idx);
virtual void lua_item_write(lua_State *state, int fname_idx, void *ptr, int idx, int val_index);
+ virtual bool is_readonly() { return false; }
+
virtual bool resize(void *ptr, int size) { return false; }
virtual bool erase(void *ptr, int index) { return false; }
virtual bool insert(void *ptr, int index, void *pitem) { return false; }
@@ -343,6 +345,33 @@ namespace df
}
};
+ template<class T>
+ class ro_stl_container_identity : public container_identity {
+ const char *name;
+
+ public:
+ ro_stl_container_identity(const char *name, type_identity *item, enum_identity *ienum = NULL)
+ : container_identity(sizeof(T), &allocator_fn<T>, item, ienum), name(name)
+ {}
+
+ std::string getFullName(type_identity *item) {
+ return name + container_identity::getFullName(item);
+ }
+
+ virtual bool is_readonly() { return true; }
+ virtual bool resize(void *ptr, int size) { return false; }
+ virtual bool erase(void *ptr, int size) { return false; }
+ virtual bool insert(void *ptr, int idx, void *item) { return false; }
+
+ protected:
+ virtual int item_count(void *ptr, CountMode) { return ((T*)ptr)->size(); }
+ virtual void *item_pointer(type_identity *item, void *ptr, int idx) {
+ auto iter = (*(T*)ptr).begin();
+ for (; idx > 0; idx--) ++iter;
+ return (void*)&*iter;
+ }
+ };
+
class bit_array_identity : public bit_container_identity {
public:
/*
@@ -517,6 +546,10 @@ namespace df
static container_identity *get();
};
+ template<class T> struct identity_traits<std::set<T> > {
+ static container_identity *get();
+ };
+
template<> struct identity_traits<BitArray<int> > {
static bit_array_identity identity;
static bit_container_identity *get() { return &identity; }
@@ -580,6 +613,13 @@ namespace df
}
template<class T>
+ inline container_identity *identity_traits<std::set<T> >::get() {
+ typedef std::set<T> container;
+ static ro_stl_container_identity<container> identity("set", identity_traits<T>::get());
+ return &identity;
+ }
+
+ template<class T>
inline bit_container_identity *identity_traits<BitArray<T> >::get() {
static bit_array_identity identity(identity_traits<T>::get());
return &identity;