summaryrefslogtreecommitdiff
path: root/ACE/ace/Active_Map_Manager_T.inl
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/Active_Map_Manager_T.inl')
-rw-r--r--ACE/ace/Active_Map_Manager_T.inl311
1 files changed, 311 insertions, 0 deletions
diff --git a/ACE/ace/Active_Map_Manager_T.inl b/ACE/ace/Active_Map_Manager_T.inl
new file mode 100644
index 00000000000..124f76c48c4
--- /dev/null
+++ b/ACE/ace/Active_Map_Manager_T.inl
@@ -0,0 +1,311 @@
+// -*- C++ -*-
+//
+// $Id$
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::bind (ACE_Active_Map_Manager_Key &key,
+ T *&internal_value)
+{
+ ACE_UINT32 slot_index;
+ int result = this->next_free (slot_index);
+
+ if (result == 0)
+ {
+ // Move from free list to occupied list
+ this->move_from_free_list_to_occupied_list (slot_index);
+
+ // Reset the key.
+ this->search_structure_[slot_index].ext_id_.increment_slot_generation_count ();
+ this->search_structure_[slot_index].ext_id_.slot_index (slot_index);
+
+ // Copy the key for the user.
+ key = this->search_structure_[slot_index].ext_id_;
+
+ // This is where the user should place the value.
+ internal_value = &this->search_structure_[slot_index].int_id_;
+
+ // Update the current size.
+ ++this->cur_size_;
+ }
+
+ return result;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::bind (const T &value,
+ ACE_Active_Map_Manager_Key &key)
+{
+ T *internal_value = 0;
+ int result = this->bind (key,
+ internal_value);
+
+ if (result == 0)
+ {
+ // Store new value.
+ *internal_value = value;
+ }
+
+ return result;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::bind (const T &value)
+{
+ ACE_Active_Map_Manager_Key key;
+ return this->bind (value, key);
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::find (const ACE_Active_Map_Manager_Key &key,
+ T *&internal_value) const
+{
+ ACE_UINT32 slot_index = key.slot_index ();
+ ACE_UINT32 slot_generation = key.slot_generation ();
+
+ if (slot_index > this->total_size_ ||
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+ this->search_structure_[slot_index].free_ ||
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+ this->search_structure_[slot_index].ext_id_.slot_generation () != slot_generation ||
+ this->search_structure_[slot_index].ext_id_.slot_index () ==
+ (ACE_UINT32)this->free_list_id ())
+ {
+ return -1;
+ }
+ else
+ {
+ // This is where the user value is.
+ internal_value = &this->search_structure_[slot_index].int_id_;
+ }
+
+ return 0;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::find (const ACE_Active_Map_Manager_Key &key) const
+{
+ T *internal_value = 0;
+ return this->find (key,
+ internal_value);
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::find (const ACE_Active_Map_Manager_Key &key,
+ T &value) const
+{
+ T *internal_value = 0;
+ int result = this->find (key,
+ internal_value);
+
+ if (result == 0)
+ value = *internal_value;
+
+ return result;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::rebind (const ACE_Active_Map_Manager_Key &key,
+ const T &value)
+{
+ int result = this->find (key);
+
+ if (result == 0)
+ {
+ // Store new value.
+ this->search_structure_[key.slot_index ()].int_id_ = value;
+ }
+
+ return result;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::rebind (const ACE_Active_Map_Manager_Key &key,
+ const T &value,
+ T &old_value)
+{
+ int result = this->find (key);
+
+ if (result == 0)
+ {
+ // Copy old value.
+ old_value = this->search_structure_[key.slot_index ()].int_id_;
+
+ // Store new value.
+ this->search_structure_[key.slot_index ()].int_id_ = value;
+ }
+
+ return result;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::rebind (const ACE_Active_Map_Manager_Key &key,
+ const T &value,
+ ACE_Active_Map_Manager_Key &old_key,
+ T &old_value)
+{
+ int result = this->find (key);
+
+ if (result == 0)
+ {
+ // Copy old key.
+ old_key = this->search_structure_[key.slot_index ()].ext_id_;
+
+ // Copy old value.
+ old_value = this->search_structure_[key.slot_index ()].int_id_;
+
+ // Store new value.
+ this->search_structure_[key.slot_index ()].int_id_ = value;
+ }
+
+ return result;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::unbind (const ACE_Active_Map_Manager_Key &key,
+ T *&internal_value)
+{
+ int result = this->find (key,
+ internal_value);
+
+ if (result == 0)
+ {
+ ACE_UINT32 slot_index = key.slot_index ();
+
+#if defined (ACE_HAS_LAZY_MAP_MANAGER)
+
+ //
+ // In the case of lazy map managers, the movement of free slots
+ // from the occupied list to the free list is delayed until we
+ // run out of free slots in the free list.
+ //
+
+ this->search_structure_[slot_index].free_ = 1;
+
+#else
+
+ // Move from occupied list to free list.
+ this->move_from_occupied_list_to_free_list (slot_index);
+
+#endif /* ACE_HAS_LAZY_MAP_MANAGER */
+
+ // Reset the slot_index. This will tell us that this entry is free.
+ this->search_structure_[slot_index].ext_id_.slot_index (this->free_list_id ());
+
+ // Update the current size.
+ --this->cur_size_;
+ }
+
+ return result;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::unbind (const ACE_Active_Map_Manager_Key &key,
+ T &value)
+{
+ T *internal_value;
+ int result = this->unbind (key,
+ internal_value);
+
+ if (result == 0)
+ {
+ // Copy old value.
+ value = *internal_value;
+ }
+
+ return result;
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::unbind (const ACE_Active_Map_Manager_Key &key)
+{
+ T *internal_value;
+ return this->unbind (key,
+ internal_value);
+}
+
+template <class T> ACE_INLINE
+ACE_Active_Map_Manager<T>::ACE_Active_Map_Manager (ACE_Allocator *alloc)
+ : ACE_AMM_BASE (alloc)
+{
+}
+
+template <class T> ACE_INLINE
+ACE_Active_Map_Manager<T>::ACE_Active_Map_Manager (size_t size,
+ ACE_Allocator *alloc)
+ : ACE_AMM_BASE (size,
+ alloc)
+{
+}
+
+template <class T> ACE_INLINE
+ACE_Active_Map_Manager<T>::~ACE_Active_Map_Manager (void)
+{
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::open (size_t length,
+ ACE_Allocator *alloc)
+{
+ return ACE_AMM_BASE::open (length, alloc);
+}
+
+template <class T> ACE_INLINE int
+ACE_Active_Map_Manager<T>::close (void)
+{
+ return ACE_AMM_BASE::close ();
+}
+
+template <class T> ACE_INLINE size_t
+ACE_Active_Map_Manager<T>::current_size (void) const
+{
+ return ACE_AMM_BASE::current_size ();
+}
+
+template <class T> ACE_INLINE size_t
+ACE_Active_Map_Manager<T>::total_size (void) const
+{
+ return ACE_AMM_BASE::total_size ();
+}
+
+/* static */
+template <class T> ACE_INLINE const ACE_Active_Map_Manager_Key
+ACE_Active_Map_Manager<T>::npos (void)
+{
+ return ACE_Active_Map_Manager_Key (~0, ~0);
+}
+
+template <class T> ACE_INLINE void
+ACE_Active_Map_Manager<T>::dump (void) const
+{
+#if defined (ACE_HAS_DUMP)
+ ACE_AMM_BASE::dump ();
+#endif /* ACE_HAS_DUMP */
+}
+
+template <class T> ACE_Map_Iterator<ACE_Active_Map_Manager_Key, T, ACE_Null_Mutex>
+ACE_Active_Map_Manager<T>::begin (void)
+{
+ return ACE_AMM_BASE::begin ();
+}
+
+template <class T> ACE_INLINE ACE_Map_Iterator<ACE_Active_Map_Manager_Key, T, ACE_Null_Mutex>
+ACE_Active_Map_Manager<T>::end (void)
+{
+ return ACE_AMM_BASE::end ();
+}
+
+template <class T> ACE_INLINE ACE_Map_Reverse_Iterator<ACE_Active_Map_Manager_Key, T, ACE_Null_Mutex>
+ACE_Active_Map_Manager<T>::rbegin (void)
+{
+ return ACE_AMM_BASE::rbegin ();
+}
+
+template <class T> ACE_INLINE ACE_Map_Reverse_Iterator<ACE_Active_Map_Manager_Key, T, ACE_Null_Mutex>
+ACE_Active_Map_Manager<T>::rend (void)
+{
+ return ACE_AMM_BASE::rend ();
+}
+
+ACE_END_VERSIONED_NAMESPACE_DECL