00001
00002
00003 #ifndef CONTAINER_LINEARMOVEMAP_H
00004 #define CONTAINER_LINEARMOVEMAP_H
00005
00006 #include "osl/misc/carray.h"
00007 #include "osl/stl/slist.h"
00008 #include "osl/move.h"
00009 #include <algorithm>
00010 #include <cassert>
00011
00012 namespace osl
00013 {
00014 namespace container
00015 {
00019 template <class T>
00020 class LinearMoveMap : private slist<T>
00021 {
00022 public:
00023 typedef slist<T> base_t;
00024 using base_t::swap;
00025 using base_t::clear;
00026 using base_t::begin;
00027 using base_t::end;
00028 using base_t::const_iterator;
00029 using base_t::iterator;
00030 using base_t::size;
00031 using base_t::empty;
00032
00037 T* insertNoCheck(const T& element)
00038 {
00039 push_front(element);
00040 return &base_t::front();
00041 }
00045 T* assign(const T& element)
00046 {
00047 const Move m = element.getMove();
00048 T *p = find(m);
00049 if (p)
00050 {
00051 *p = element;
00052 return p;
00053 }
00054 return insertNoCheck(element);
00055 }
00056 T* find(Move key)
00057 {
00058 for (typename base_t::iterator p=begin(); p!=end(); ++p)
00059 {
00060 if (p->getMove() == key)
00061 return &*p;
00062 }
00063 return 0;
00064 }
00065 const T* find(Move key) const
00066 {
00067 for (typename base_t::const_iterator p=begin(); p!=end(); ++p)
00068 {
00069 if (p->getMove() == key)
00070 return &*p;
00071 }
00072 return 0;
00073 }
00074 };
00075 }
00076 using container::LinearMoveMap;
00077 }
00078
00079
00080 #endif
00081
00082
00083
00084