summaryrefslogtreecommitdiff
path: root/cpp/include/Freeze/Map.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/include/Freeze/Map.h')
-rw-r--r--cpp/include/Freeze/Map.h204
1 files changed, 106 insertions, 98 deletions
diff --git a/cpp/include/Freeze/Map.h b/cpp/include/Freeze/Map.h
index fa5d75ac92d..66f64b83f3d 100644
--- a/cpp/include/Freeze/Map.h
+++ b/cpp/include/Freeze/Map.h
@@ -71,6 +71,7 @@ protected:
MapIndexBase(const std::string&, bool);
Ice::CommunicatorPtr _communicator;
+ Ice::EncodingVersion _encoding;
private:
@@ -182,11 +183,9 @@ public:
//
// Forward declaration
//
-template <typename key_type, typename mapped_type,
- typename KeyCodec, typename ValueCodec, typename Compare>
+template <typename key_type, typename mapped_type, typename KeyCodec, typename ValueCodec, typename Compare>
class Map;
-template <typename key_type, typename mapped_type,
- typename KeyCodec, typename ValueCodec, typename Compare>
+template <typename key_type, typename mapped_type, typename KeyCodec, typename ValueCodec, typename Compare>
class ConstIterator;
//
@@ -208,8 +207,7 @@ struct IteratorBase
// TODO: It's possible to implement bidirectional iterators, if
// necessary.
//
-template<typename key_type, typename mapped_type,
- typename KeyCodec, typename ValueCodec, typename Compare>
+template<typename key_type, typename mapped_type, typename KeyCodec, typename ValueCodec, typename Compare>
class Iterator : public IteratorBase
{
public:
@@ -222,20 +220,23 @@ public:
typedef value_type& reference;
- Iterator(IteratorHelper* helper, const Ice::CommunicatorPtr& communicator) :
+ Iterator(IteratorHelper* helper, const Ice::CommunicatorPtr& communicator, const Ice::EncodingVersion& encoding) :
_helper(helper),
_communicator(communicator),
+ _encoding(encoding),
_refValid(false)
{
}
Iterator() :
+ _encoding(Ice::Encoding_1_0),
_refValid(false)
{
}
Iterator(const Iterator& rhs) :
_communicator(rhs._communicator),
+ _encoding(rhs._encoding),
_refValid(false)
{
if(rhs._helper.get() != 0)
@@ -257,6 +258,7 @@ public:
_helper.reset();
}
_communicator = rhs._communicator;
+ _encoding = rhs._encoding;
_refValid = false;
}
@@ -343,7 +345,7 @@ public:
assert(_helper.get());
Value v;
- ValueCodec::write(value, v, _communicator);
+ ValueCodec::write(value, v, _communicator, _encoding);
_helper->set(v);
_refValid = false;
}
@@ -374,17 +376,17 @@ private:
assert(k != 0);
assert(v != 0);
- KeyCodec::read(key, *k, _communicator);
- ValueCodec::read(value, *v, _communicator);
+ KeyCodec::read(key, *k, _communicator, _encoding);
+ ValueCodec::read(value, *v, _communicator, _encoding);
}
- friend class ConstIterator<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare>;
- friend class Map<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare>;
+ friend class ConstIterator<key_type, mapped_type, KeyCodec, ValueCodec, Compare>;
+ friend class Map<key_type, mapped_type, KeyCodec, ValueCodec, Compare>;
std::auto_ptr<IteratorHelper> _helper;
Ice::CommunicatorPtr _communicator;
+ Ice::EncodingVersion _encoding;
+
//
// Cached last return value. This is so that operator->() can
// actually return a pointer. The cached value is reused across
@@ -403,8 +405,7 @@ private:
//
// See Iterator comments for design notes
//
-template <typename key_type, typename mapped_type,
- typename KeyCodec, typename ValueCodec, typename Compare>
+template <typename key_type, typename mapped_type, typename KeyCodec, typename ValueCodec, typename Compare>
class ConstIterator : public IteratorBase
{
public:
@@ -417,20 +418,25 @@ public:
typedef value_type& reference;
- ConstIterator(IteratorHelper* helper, const Ice::CommunicatorPtr& communicator) :
+ ConstIterator(IteratorHelper* helper,
+ const Ice::CommunicatorPtr& communicator,
+ const Ice::EncodingVersion& encoding) :
_helper(helper),
_communicator(communicator),
+ _encoding(encoding),
_refValid(false)
{
}
ConstIterator() :
+ _encoding(Ice::Encoding_1_0),
_refValid(false)
{
}
ConstIterator(const ConstIterator& rhs) :
_communicator(rhs._communicator),
+ _encoding(rhs._encoding),
_refValid(false)
{
if(rhs._helper.get() != 0)
@@ -443,15 +449,15 @@ public:
// A Iterator can be converted to a ConstIterator (but not
// vice versa) - same for operator=.
//
- ConstIterator(const Iterator<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare>& rhs) :
+ ConstIterator(const Iterator<key_type, mapped_type, KeyCodec, ValueCodec, Compare>& rhs) :
+ _communicator(rhs._communicator),
+ _encoding(rhs._encoding),
_refValid(false)
{
if(rhs._helper.get() != 0)
{
_helper.reset(rhs._helper->clone());
}
- _communicator = rhs._communicator;
}
ConstIterator& operator=(const ConstIterator& rhs)
@@ -467,6 +473,7 @@ public:
_helper.reset();
}
_communicator = rhs._communicator;
+ _encoding = rhs._encoding;
_refValid = false;
}
@@ -476,8 +483,7 @@ public:
//
// Create const_iterator from iterator.
//
- ConstIterator& operator=(const Iterator<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare>& rhs)
+ ConstIterator& operator=(const Iterator<key_type, mapped_type, KeyCodec, ValueCodec, Compare>& rhs)
{
if(rhs._helper.get() != 0)
{
@@ -488,6 +494,7 @@ public:
_helper.reset();
}
_communicator = rhs._communicator;
+ _encoding = rhs._encoding;
_refValid = false;
return *this;
@@ -591,15 +598,15 @@ private:
assert(k != 0);
assert(v != 0);
- KeyCodec::read(key, *k, _communicator);
- ValueCodec::read(value, *v, _communicator);
+ KeyCodec::read(key, *k, _communicator, _encoding);
+ ValueCodec::read(value, *v, _communicator, _encoding);
}
- friend class Map<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare>;
+ friend class Map<key_type, mapped_type, KeyCodec, ValueCodec, Compare>;
std::auto_ptr<IteratorHelper> _helper;
Ice::CommunicatorPtr _communicator;
+ Ice::EncodingVersion _encoding;
//
// Cached last return value. This is so that operator->() can
@@ -649,23 +656,25 @@ template<typename key_type, typename KeyCodec, typename Compare>
class KeyCompare : public KeyCompareBase
{
public:
- KeyCompare(const Compare& mapCompare,
- const Ice::CommunicatorPtr& communicator) :
+ KeyCompare(const Compare& mapCompare,
+ const Ice::CommunicatorPtr& communicator,
+ const Ice::EncodingVersion& encoding) :
#if defined(_MSC_VER) && (_MSC_VER < 1300)
KeyCompareBase(enableKeyCompare(mapCompare)),
#else
KeyCompareBase(true),
#endif
_compare(mapCompare),
- _communicator(communicator)
+ _communicator(communicator),
+ _encoding(encoding)
{}
virtual int compare(const Key& dbKey1, const Key& dbKey2)
{
key_type key1;
- KeyCodec::read(key1, dbKey1, _communicator);
+ KeyCodec::read(key1, dbKey1, _communicator, _encoding);
key_type key2;
- KeyCodec::read(key2, dbKey2, _communicator);
+ KeyCodec::read(key2, dbKey2, _communicator, _encoding);
if(_compare(key1, key2))
{
@@ -682,7 +691,8 @@ public:
}
private:
Compare _compare;
- Ice::CommunicatorPtr _communicator;
+ const Ice::CommunicatorPtr _communicator;
+ const Ice::EncodingVersion _encoding;
};
#if !defined(_MSC_VER) || (_MSC_VER >= 1300)
@@ -694,7 +704,7 @@ template<typename key_type, typename KeyCodec>
class KeyCompare<key_type, KeyCodec, IceEncodingCompare> : public KeyCompareBase
{
public:
- KeyCompare(const IceEncodingCompare&, const Ice::CommunicatorPtr&):
+ KeyCompare(const IceEncodingCompare&, const Ice::CommunicatorPtr&, const Ice::EncodingVersion&):
KeyCompareBase(false)
{}
@@ -717,9 +727,9 @@ public:
virtual int compare(const Key& dbKey1, const Key& dbKey2)
{
key_type key1;
- KeyCodec::read(key1, dbKey1, _communicator);
+ KeyCodec::read(key1, dbKey1, _communicator, _encoding);
key_type key2;
- KeyCodec::read(key2, dbKey2, _communicator);
+ KeyCodec::read(key2, dbKey2, _communicator, _encoding);
if(_compare(key1, key2))
{
@@ -787,10 +797,8 @@ public:
typedef std::pair<const key_type, const mapped_type> value_type;
- typedef Iterator<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare> iterator;
- typedef ConstIterator<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare> const_iterator;
+ typedef Iterator<key_type, mapped_type, KeyCodec, ValueCodec, Compare> iterator;
+ typedef ConstIterator<key_type, mapped_type, KeyCodec, ValueCodec, Compare> const_iterator;
//
// No definition for reference, const_reference, pointer or
@@ -812,15 +820,14 @@ public:
const std::string& dbName,
bool createDb = true,
const Compare& compare = Compare()) :
- _communicator(connection->getCommunicator())
+ _communicator(connection->getCommunicator()),
+ _encoding(connection->getEncoding())
{
- KeyCompareBasePtr keyCompare =
- new KeyCompare<key_type, KeyCodec, Compare>(compare, _communicator);
+ KeyCompareBasePtr keyCompare = new KeyCompare<key_type, KeyCodec, Compare>(compare, _communicator, _encoding);
std::vector<MapIndexBasePtr> indices;
- _helper.reset(MapHelper::create(connection, dbName,
- KeyCodec::typeId(), ValueCodec::typeId(),
- keyCompare, indices, createDb));
+ _helper.reset(MapHelper::create(connection, dbName, KeyCodec::typeId(), ValueCodec::typeId(), keyCompare,
+ indices, createDb));
}
template<class _InputIterator>
@@ -829,16 +836,16 @@ public:
bool createDb,
_InputIterator first, _InputIterator last,
const Compare& compare = Compare()) :
- _communicator(connection->getCommunicator())
+ _communicator(connection->getCommunicator()),
+ _encoding(connection->getEncoding())
{
- KeyCompareBasePtr keyCompare =
- new KeyCompare<key_type, KeyCodec, Compare>(compare, _communicator);
+ KeyCompareBasePtr keyCompare = new KeyCompare<key_type, KeyCodec, Compare>(compare, _communicator, _encoding);
std::vector<MapIndexBasePtr> indices;
- _helper.reset(MapHelper::create(connection, dbName,
- KeyCodec::typeId(), ValueCodec::typeId(),
- keyCompare, indices, createDb));
+ _helper.reset(MapHelper::create(connection, dbName, KeyCodec::typeId(), ValueCodec::typeId(), keyCompare,
+ indices, createDb));
+
while(first != last)
{
put(*first);
@@ -850,17 +857,17 @@ public:
{
}
- static void recreate(const Freeze::ConnectionPtr& connection,
- const std::string& dbName,
- const Compare& compare = Compare())
- {
- KeyCompareBasePtr keyCompare =
- new KeyCompare<key_type, KeyCodec, Compare>(compare, connection->getCommunicator());
+ // static void recreate(const Freeze::ConnectionPtr& connection,
+ // const std::string& dbName,
+ // const Compare& compare = Compare())
+ // {
+ // KeyCompareBasePtr keyCompare = new KeyCompare<key_type, KeyCodec, Compare>(compare,
+ // connection->getCommunicator(),
+ // connection->getEncoding());
- std::vector<MapIndexBasePtr> indices;
- MapHelper::recreate(connection, dbName, KeyCodec::typeId(), ValueCodec::typeId(), keyCompare,
- indices);
- }
+ // std::vector<MapIndexBasePtr> indices;
+ // MapHelper::recreate(connection, dbName, KeyCodec::typeId(), ValueCodec::typeId(), keyCompare, indices);
+ // }
bool operator==(const Map& rhs) const
@@ -901,17 +908,20 @@ public:
MapHelper* tmp = _helper.release();
_helper.reset(rhs._helper.release());
rhs._helper.reset(tmp);
-
+
Ice::CommunicatorPtr tmpCom = _communicator;
+ Ice::EncodingVersion tmpEnc = _encoding;
_communicator = rhs._communicator;
+ _encoding = rhs._encoding;
rhs._communicator = tmpCom;
+ rhs._encoding = tmpEnc;
}
iterator begin()
{
try
{
- return iterator(IteratorHelper::create(*_helper.get(), false), _communicator);
+ return iterator(IteratorHelper::create(*_helper.get(), false), _communicator, _encoding);
}
catch(const NotFoundException&)
{
@@ -922,7 +932,7 @@ public:
{
try
{
- return const_iterator(IteratorHelper::create(*_helper.get(), true), _communicator);
+ return const_iterator(IteratorHelper::create(*_helper.get(), true), _communicator, _encoding);
}
catch(const NotFoundException&)
{
@@ -981,17 +991,17 @@ public:
// position is ignored.
//
Key k;
- KeyCodec::write(key.first, k, _communicator);
+ KeyCodec::write(key.first, k, _communicator, _encoding);
- iterator r = iterator(_helper->find(k, false), _communicator);
+ iterator r = iterator(_helper->find(k, false), _communicator, _encoding);
if(r == end())
{
Value v;
- ValueCodec::write(key.second, v, _communicator);
+ ValueCodec::write(key.second, v, _communicator, _encoding);
_helper->put(k, v);
- r = iterator(_helper->find(k, false), _communicator);
+ r = iterator(_helper->find(k, false), _communicator, _encoding);
}
return r;
@@ -1000,19 +1010,19 @@ public:
std::pair<iterator, bool> insert(const value_type& key)
{
Key k;
- KeyCodec::write(key.first, k, _communicator);
+ KeyCodec::write(key.first, k, _communicator, _encoding);
- iterator r = iterator(_helper->find(k, false), _communicator);
+ iterator r = iterator(_helper->find(k, false), _communicator, _encoding);
bool inserted = false;
if(r == end())
{
Value v;
- ValueCodec::write(key.second, v, _communicator);
+ ValueCodec::write(key.second, v, _communicator, _encoding);
_helper->put(k, v);
inserted = true;
- r = iterator(_helper->find(k, false), _communicator);
+ r = iterator(_helper->find(k, false), _communicator, _encoding);
}
return std::pair<iterator, bool>(r, inserted);
@@ -1035,8 +1045,8 @@ public:
//
Key k;
Value v;
- KeyCodec::write(key.first, k, _communicator);
- ValueCodec::write(key.second, v, _communicator);
+ KeyCodec::write(key.first, k, _communicator, _encoding);
+ ValueCodec::write(key.second, v, _communicator, _encoding);
_helper->put(k, v);
}
@@ -1060,7 +1070,7 @@ public:
size_type erase(const key_type& key)
{
Key k;
- KeyCodec::write(key, k, _communicator);
+ KeyCodec::write(key, k, _communicator, _encoding);
return _helper->erase(k);
}
@@ -1099,23 +1109,23 @@ public:
iterator find(const key_type& key)
{
Key k;
- KeyCodec::write(key, k, _communicator);
+ KeyCodec::write(key, k, _communicator, _encoding);
- return iterator(_helper->find(k, false), _communicator);
+ return iterator(_helper->find(k, false), _communicator, _encoding);
}
const_iterator find(const key_type& key) const
{
Key k;
- KeyCodec::write(key, k, _communicator);
+ KeyCodec::write(key, k, _communicator, _encoding);
- return const_iterator(_helper->find(k, true), _communicator);
+ return const_iterator(_helper->find(k, true), _communicator, _encoding);
}
size_type count(const key_type& key) const
{
Key k;
- KeyCodec::write(key, k, _communicator);
+ KeyCodec::write(key, k, _communicator, _encoding);
return _helper->count(k);
}
@@ -1123,33 +1133,33 @@ public:
iterator lower_bound(const key_type& key)
{
Key k;
- KeyCodec::write(key, k, _communicator);
+ KeyCodec::write(key, k, _communicator, _encoding);
- return iterator(_helper->lowerBound(k, false), _communicator);
+ return iterator(_helper->lowerBound(k, false), _communicator, _encoding);
}
const_iterator lower_bound(const key_type& key) const
{
Key k;
- KeyCodec::write(key, k, _communicator);
+ KeyCodec::write(key, k, _communicator, _encoding);
- return iterator(_helper->lowerBound(k, true), _communicator);
+ return iterator(_helper->lowerBound(k, true), _communicator, _encoding);
}
iterator upper_bound(const key_type& key)
{
Key k;
- KeyCodec::write(key, k, _communicator);
+ KeyCodec::write(key, k, _communicator, _encoding);
- return iterator(_helper->upperBound(k, false), _communicator);
+ return iterator(_helper->upperBound(k, false), _communicator, _encoding);
}
const_iterator upper_bound(const key_type& key) const
{
Key k;
- KeyCodec::write(key, k, _communicator);
+ KeyCodec::write(key, k, _communicator, _encoding);
- return iterator(_helper->upperBound(k, true), _communicator);
+ return iterator(_helper->upperBound(k, true), _communicator, _encoding);
}
std::pair<iterator, iterator> equal_range(const key_type& key)
@@ -1179,13 +1189,15 @@ public:
protected:
- Map(const Ice::CommunicatorPtr& mapCommunicator) :
- _communicator(mapCommunicator)
+ Map(const Ice::CommunicatorPtr& mapCommunicator, const Ice::EncodingVersion& encoding) :
+ _communicator(mapCommunicator),
+ _encoding(encoding)
{
}
std::auto_ptr<MapHelper> _helper;
Ice::CommunicatorPtr _communicator;
+ Ice::EncodingVersion _encoding;
};
@@ -1199,20 +1211,16 @@ namespace std
{
// TODO: update.
-template <class key_type, class mapped_type,
- class KeyCodec, class ValueCodec, class Compare>
+template <class key_type, class mapped_type, class KeyCodec, class ValueCodec, class Compare>
inline pair<const key_type, const mapped_type>*
-value_type(const Freeze::Iterator<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare>&)
+value_type(const Freeze::Iterator<key_type, mapped_type, KeyCodec, ValueCodec, Compare>&)
{
return (pair<const key_type, const mapped_type>*)0;
}
-template <class key_type, class mapped_type,
- class KeyCodec, class ValueCodec, class Compare>
+template <class key_type, class mapped_type, class KeyCodec, class ValueCodec, class Compare>
inline pair<const key_type, const mapped_type>*
-value_type(const Freeze::ConstIterator<key_type, mapped_type,
- KeyCodec, ValueCodec, Compare>&)
+value_type(const Freeze::ConstIterator<key_type, mapped_type, KeyCodec, ValueCodec, Compare>&)
{
return (pair<const key_type, const mapped_type>*)0;
}