summaryrefslogtreecommitdiff
path: root/ace/Array_Map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ace/Array_Map.cpp')
-rw-r--r--ace/Array_Map.cpp135
1 files changed, 75 insertions, 60 deletions
diff --git a/ace/Array_Map.cpp b/ace/Array_Map.cpp
index 008de606c28..01fbf4cdcae 100644
--- a/ace/Array_Map.cpp
+++ b/ace/Array_Map.cpp
@@ -10,13 +10,13 @@
#endif /* !__ACE_INLINE__ */
#include <algorithm>
-#include <functional>
#ifndef ACE_LACKS_MEMBER_TEMPLATES
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
template<typename InputIterator>
-ACE_Array_Map<Key, Value>::ACE_Array_Map (InputIterator f, InputIterator l)
+ACE_Array_Map<Key, Value, EqualTo>::ACE_Array_Map (InputIterator f,
+ InputIterator l)
: size_ (l - f)
, capacity_ (size_)
, nodes_ (size_ == 0 ? 0 : new value_type[size_])
@@ -29,10 +29,10 @@ ACE_Array_Map<Key, Value>::ACE_Array_Map (InputIterator f, InputIterator l)
// *n = *i;
}
#else
-template<typename Key, typename Value>
-ACE_Array_Map<Key, Value>::ACE_Array_Map (
- typename ACE_Array_Map<Key, Value>::const_iterator f,
- typename ACE_Array_Map<Key, Value>::const_iterator l)
+template<typename Key, typename Value, class EqualTo>
+ACE_Array_Map<Key, Value, EqualTo>::ACE_Array_Map (
+ typename ACE_Array_Map<Key, Value, EqualTo>::const_iterator f,
+ typename ACE_Array_Map<Key, Value, EqualTo>::const_iterator l)
: size_ (l - f)
, capacity_ (size_)
, nodes_ (size_ == 0 ? 0 : new value_type[size_])
@@ -46,9 +46,9 @@ ACE_Array_Map<Key, Value>::ACE_Array_Map (
}
#endif /* !ACE_LACKS_MEMBER_TEMPLATES */
-template<typename Key, typename Value>
-ACE_Array_Map<Key, Value>::ACE_Array_Map (
- ACE_Array_Map<Key, Value> const & map)
+template<typename Key, typename Value, class EqualTo>
+ACE_Array_Map<Key, Value, EqualTo>::ACE_Array_Map (
+ ACE_Array_Map<Key, Value, EqualTo> const & map)
: size_ (map.size_)
, capacity_ (map.size_)
, nodes_ (size_ == 0 ? 0 : new value_type[size_])
@@ -63,30 +63,31 @@ ACE_Array_Map<Key, Value>::ACE_Array_Map (
// *n = *i;
}
-template<typename Key, typename Value>
-ACE_Array_Map<Key, Value>::~ACE_Array_Map (void)
+template<typename Key, typename Value, class EqualTo>
+ACE_Array_Map<Key, Value, EqualTo>::~ACE_Array_Map (void)
{
delete[] this->nodes_;
}
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
void
-ACE_Array_Map<Key, Value>::swap (ACE_Array_Map<Key, Value> & map)
+ACE_Array_Map<Key, Value, EqualTo>::swap (
+ ACE_Array_Map<Key, Value, EqualTo> & map)
{
std::swap (this->size_, map.size_);
std::swap (this->capacity_, map.capacity_);
std::swap (this->nodes_, map.nodes_);
}
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
#if defined (_MSC_VER) && (_MSC_VER <= 1200)
// MSVC++ 6 doesn't like the typename qualification.
-std::pair<ACE_Array_Map<Key, Value>::iterator, bool>
+std::pair<ACE_Array_Map<Key, Value, EqualTo>::iterator, bool>
#else
-std::pair<typename ACE_Array_Map<Key, Value>::iterator, bool>
+std::pair<typename ACE_Array_Map<Key, Value, EqualTo>::iterator, bool>
#endif /* _MSC_VER <= 1200 */
-ACE_Array_Map<Key, Value>::insert (
- typename ACE_Array_Map<Key, Value>::value_type const & x)
+ACE_Array_Map<Key, Value, EqualTo>::insert (
+ typename ACE_Array_Map<Key, Value, EqualTo>::value_type const & x)
{
// Linear insertion due to linear duplicate key search.
@@ -112,10 +113,10 @@ ACE_Array_Map<Key, Value>::insert (
}
#ifndef ACE_LACKS_MEMBER_TEMPLATES
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
template<typename InputIterator>
void
-ACE_Array_Map<Key, Value>::insert (InputIterator f, InputIterator l)
+ACE_Array_Map<Key, Value, EqualTo>::insert (InputIterator f, InputIterator l)
{
this->grow (l - f); // Preallocate storage.
@@ -125,11 +126,11 @@ ACE_Array_Map<Key, Value>::insert (InputIterator f, InputIterator l)
}
}
#else
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
void
-ACE_Array_Map<Key, Value>::insert (
- typename ACE_Array_Map<Key, Value>::const_iterator f,
- typename ACE_Array_Map<Key, Value>::const_iterator l)
+ACE_Array_Map<Key, Value, EqualTo>::insert (
+ typename ACE_Array_Map<Key, Value, EqualTo>::const_iterator f,
+ typename ACE_Array_Map<Key, Value, EqualTo>::const_iterator l)
{
this->grow (l - f); // Preallocate storage.
@@ -140,27 +141,37 @@ ACE_Array_Map<Key, Value>::insert (
}
#endif /* ACE_LACKS_MEMBER_TEMPLATES */
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
void
-ACE_Array_Map<Key, Value>::erase (
- typename ACE_Array_Map<Key, Value>::iterator pos)
+ACE_Array_Map<Key, Value, EqualTo>::erase (
+ typename ACE_Array_Map<Key, Value, EqualTo>::iterator pos)
{
iterator const first = this->begin ();
iterator const last = this->end ();
if (pos >= first && pos < last)
{
- if (this->size_ > 1 && pos < last - 1)
- *pos = *(last - 1);
+ if (pos != last - 1)
+ {
+ // Relocate the tail element to the location of the erased
+ // element to prevent introduction of "holes" in the
+ // underlying array.
+ *pos = *(last - 1);
+ }
+
+ // Explicitly destroy the tail element by assigning a default
+ // constructed instance to it. Note that this also works for
+ // the case of a map of size 1.
+ *(last - 1) = value_type ();
--this->size_;
}
}
-template<typename Key, typename Value>
-typename ACE_Array_Map<Key, Value>::size_type
-ACE_Array_Map<Key, Value>::erase (
- typename ACE_Array_Map<Key, Value>::key_type const & k)
+template<typename Key, typename Value, class EqualTo>
+typename ACE_Array_Map<Key, Value, EqualTo>::size_type
+ACE_Array_Map<Key, Value, EqualTo>::erase (
+ typename ACE_Array_Map<Key, Value, EqualTo>::key_type const & k)
{
iterator pos = this->find (k);
@@ -171,56 +182,60 @@ ACE_Array_Map<Key, Value>::erase (
return old_size - this->size_;
}
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
void
-ACE_Array_Map<Key, Value>::erase (
- typename ACE_Array_Map<Key, Value>::iterator first,
- typename ACE_Array_Map<Key, Value>::iterator last)
+ACE_Array_Map<Key, Value, EqualTo>::erase (
+ typename ACE_Array_Map<Key, Value, EqualTo>::iterator first,
+ typename ACE_Array_Map<Key, Value, EqualTo>::iterator last)
{
if (this->begin () <= first && first < last && last < this->end ())
for (iterator i = first; i != last; ++i)
this->erase (i);
}
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
void
-ACE_Array_Map<Key, Value>::clear (void)
+ACE_Array_Map<Key, Value, EqualTo>::clear (void)
{
this->size_ = 0; // No need to deallocate array nor destroy elements.
}
-template<typename Key, typename Value>
-typename ACE_Array_Map<Key, Value>::iterator
-ACE_Array_Map<Key, Value>::find (
- typename ACE_Array_Map<Key, Value>::key_type const & k)
+template<typename Key, typename Value, class EqualTo>
+typename ACE_Array_Map<Key, Value, EqualTo>::iterator
+ACE_Array_Map<Key, Value, EqualTo>::find (
+ typename ACE_Array_Map<Key, Value, EqualTo>::key_type const & k)
{
iterator const the_end = this->end ();
+ EqualTo eq;
+
for (iterator i = this->begin (); i != the_end; ++i)
- if (k == i->first)
+ if (eq (k, i->first))
return i;
return this->end ();
}
-template<typename Key, typename Value>
-typename ACE_Array_Map<Key, Value>::const_iterator
-ACE_Array_Map<Key, Value>::find (
- typename ACE_Array_Map<Key, Value>::key_type const & k) const
+template<typename Key, typename Value, class EqualTo>
+typename ACE_Array_Map<Key, Value, EqualTo>::const_iterator
+ACE_Array_Map<Key, Value, EqualTo>::find (
+ typename ACE_Array_Map<Key, Value, EqualTo>::key_type const & k) const
{
const_iterator const the_end = this->end ();
+ EqualTo eq;
+
for (const_iterator i = this->begin (); i != the_end; ++i)
- if (k == i->first)
+ if (eq (k, i->first))
return i;
return this->end ();
}
-template<typename Key, typename Value>
+template<typename Key, typename Value, class EqualTo>
void
-ACE_Array_Map<Key, Value>::grow (
- typename ACE_Array_Map<Key, Value>::size_type s)
+ACE_Array_Map<Key, Value, EqualTo>::grow (
+ typename ACE_Array_Map<Key, Value, EqualTo>::size_type s)
{
if (this->size () + s > this->capacity_)
{
@@ -229,7 +244,7 @@ ACE_Array_Map<Key, Value>::grow (
// Strongly exception safe.
- ACE_Array_Map<Key, Value> temp (this->size () + s);
+ ACE_Array_Map<Key, Value, EqualTo> temp (this->size () + s);
std::copy (this->begin (), this->end (), temp.begin ());
@@ -245,10 +260,10 @@ ACE_Array_Map<Key, Value>::grow (
// ---------------------------------------------------------------
-template <typename Key, typename Value>
+template <typename Key, typename Value, class EqualTo>
bool
-operator== (ACE_Array_Map<Key, Value> const & lhs,
- ACE_Array_Map<Key, Value> const & rhs)
+operator== (ACE_Array_Map<Key, Value, EqualTo> const & lhs,
+ ACE_Array_Map<Key, Value, EqualTo> const & rhs)
{
// Do not include Array_Map capacity in comparison. It isn't useful
// in this case.
@@ -257,10 +272,10 @@ operator== (ACE_Array_Map<Key, Value> const & lhs,
&& std::equal (lhs.begin (), lhs.end (), rhs.begin ()));
}
-template <typename Key, typename Value>
+template <typename Key, typename Value, class EqualTo>
bool
-operator< (ACE_Array_Map<Key, Value> const & lhs,
- ACE_Array_Map<Key, Value> const & rhs)
+operator< (ACE_Array_Map<Key, Value, EqualTo> const & lhs,
+ ACE_Array_Map<Key, Value, EqualTo> const & rhs)
{
return std::lexicographical_compare (lhs.begin (), lhs.end (),
rhs.begin (), rhs.end ());