summaryrefslogtreecommitdiff
path: root/ACE/apps/JAWS2/JAWS/Cache_List_T.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/JAWS2/JAWS/Cache_List_T.cpp')
-rw-r--r--ACE/apps/JAWS2/JAWS/Cache_List_T.cpp217
1 files changed, 217 insertions, 0 deletions
diff --git a/ACE/apps/JAWS2/JAWS/Cache_List_T.cpp b/ACE/apps/JAWS2/JAWS/Cache_List_T.cpp
new file mode 100644
index 00000000000..f6515d2652d
--- /dev/null
+++ b/ACE/apps/JAWS2/JAWS/Cache_List_T.cpp
@@ -0,0 +1,217 @@
+// $Id$
+
+#ifndef JAWS_CACHE_LIST_T_CPP
+#define JAWS_CACHE_LIST_T_CPP
+
+#include "JAWS/Cache_List_T.h"
+#include "JAWS/Cache_Manager_T.h"
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN>
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::JAWS_Cache_List (ACE_Allocator *alloc,
+ size_t maxsize)
+ : allocator_ (alloc),
+ maxsize_ (maxsize),
+ size_ (0),
+ head_ (0),
+ tail_ (0)
+{
+ if (this->allocator_ == 0)
+ this->allocator_ = ACE_Allocator::instance ();
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN>
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::~JAWS_Cache_List (void)
+{
+ while (this->head_ != 0)
+ this->remove (this->head_);
+
+ this->allocator_ = 0;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> int
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::is_empty (void) const
+{
+ return (this->size_ == 0);
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> int
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::is_full (void) const
+{
+ return (this->size_ == this->maxsize_);
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> size_t
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::size (void) const
+{
+ return this->size_;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> size_t
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::maxsize (void) const
+{
+ return this->maxsize_;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> int
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::maxsize (Cache_Manager *,
+ size_t new_maxsize)
+{
+ this->maxsize_ = new_maxsize;
+ return 0;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> void
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::insert_i (Cache_List_Item *item)
+{
+ /* ASSERT: this->size_ < this->maxsize_ */
+ item->next_ = 0;
+ item->prev_ = 0;
+
+ if (this->size_++ == 0)
+ this->head_ = this->tail_ = item;
+ else
+ {
+ this->tail_->next_ = item;
+ item->prev_ = this->tail_;
+ this->tail_ = item;
+ }
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> int
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::insert (const EXT_ID &ext_id,
+ JAWS_Cache_Object *const &int_id)
+{
+ if (this->is_full ())
+ return -1;
+
+ Cache_List_Item *item = 0;
+ ACE_NEW_MALLOC_RETURN (item,
+ (Cache_List_Item *)
+ this->allocator_->malloc (sizeof (Cache_List_Item)),
+ Cache_List_Item (ext_id, int_id), -1);
+
+ this->insert_i (item);
+
+ return 0;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> void
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::remove_i (void)
+{
+ /* ASSERT: this->size_ > 0 */
+ this->size_--;
+ this->item_ = this->head_;
+ if (this->head_ == this->tail_)
+ {
+ this->head_ = this->tail_ = 0;
+ return;
+ }
+
+ this->head_ = this->head_->next_;
+ this->head_->prev_ = 0;
+ this->item_->next_ = 0;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> void
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::remove_i (Cache_List_Item *item)
+{
+ this->size_--;
+ this->item_ = item;
+
+ if (item->next_ == 0 && item->prev_ == 0)
+ {
+ this->head_ = this->tail_ = 0;
+ }
+ else if (item->next_ == 0)
+ {
+ this->tail_ = item->prev_;
+ this->tail_->next_ = 0;
+ }
+ else if (item->prev_ == 0)
+ {
+ this->head_ = item->next_;
+ this->head_->prev_ = 0;
+ }
+ else
+ {
+ item->next_->prev_ = item->prev_;
+ item->prev_->next_ = item->next_;
+ }
+
+ item->next_ = 0;
+ item->prev_ = 0;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> int
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::remove (EXT_ID &ext_id,
+ JAWS_Cache_Object *&int_id)
+{
+ if (this->is_empty ())
+ return -1;
+
+ this->remove_i ();
+
+ ext_id = this->item_->ext_id_;
+ int_id = this->item_->int_id_;
+ int_id->heap_item (0);
+
+
+ ACE_DES_FREE_TEMPLATE4(this->item_, this->allocator_->free,
+ JAWS_Cache_List_Item,
+ EXT_ID, FACT, H_FN, E_FN);
+
+ this->item_ = 0;
+ return 0;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> int
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::remove (void *item)
+{
+ if (item == 0)
+ return 0;
+
+ this->remove_i ((Cache_List_Item *) item);
+ this->item_->int_id_->heap_item (0);
+
+ ACE_DES_FREE_TEMPLATE4(this->item_, this->allocator_->free,
+ JAWS_Cache_List_Item,
+ EXT_ID, FACT, H_FN, E_FN);
+
+ this->item_ = 0;
+
+ return 0;
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> int
+JAWS_Cache_List<EXT_ID,FACT,H_FN,E_FN>::adjust (void *item)
+{
+ if (item == 0)
+ return 0;
+
+ Cache_List_Item *real_item = (Cache_List_Item *) item;
+
+ this->remove_i (real_item);
+ this->insert_i (real_item);
+ this->item_ = 0;
+
+ return 0;
+}
+
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN>
+JAWS_Cache_List_Item<EXT_ID,FACT,H_FN,E_FN>::
+JAWS_Cache_List_Item (const EXT_ID &ext_id, JAWS_Cache_Object *const &int_id)
+ : ext_id_ (ext_id),
+ int_id_ (int_id)
+{
+ this->int_id_->heap_item (this);
+}
+
+template <class EXT_ID, class FACT, class H_FN, class E_FN> unsigned int
+JAWS_Cache_List_Item<EXT_ID,FACT,H_FN,E_FN>::priority (void)
+{
+ return this->int_id_->priority ();
+}
+
+
+#endif /* JAWS_CACHE_LIST_T_CPP */