intmap.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00038 #ifndef COL_INTMAP_H
00039 #define COL_INTMAP_H
00040
00041 #include "fastlib/base/base.h"
00042
00046 template<class TValue>
00047 class DenseIntMap {
00048 public:
00049 typedef TValue Value;
00050
00051 private:
00052 Value *ptr_;
00053 index_t size_;
00054 Value default_value_;
00055
00056 OT_DEF(DenseIntMap) {
00057 OT_MY_OBJECT(size_);
00058 OT_MY_OBJECT(default_value_);
00059 OT_MALLOC_ARRAY(ptr_, size_);
00060 }
00061
00062 public:
00064 void Init() {
00065 ptr_ = NULL;
00066 size_ = 0;
00067 }
00068
00070 Value& default_value() {
00071 return default_value_;
00072 }
00074 const Value& default_value() const {
00075 return default_value_;
00076 }
00077
00084 index_t size() const {
00085 return size_;
00086 }
00087
00093 Value& operator [] (index_t index) {
00094 DEBUG_BOUNDS(index, BIG_BAD_NUMBER);
00095 if (unlikely(index >= size_)) {
00096 index_t old_size = size_;
00097 size_ = std::max(size_ * 2, index + 1);
00098 ptr_ = mem::Realloc(ptr_, size_);
00099 for (index_t i = old_size; i < size_; i++) {
00100 new(ptr_+i)Value(default_value_);
00101 }
00102 }
00103 return ptr_[index];
00104 }
00108 const Value& operator [] (index_t index) const {
00109 return get(index);
00110 }
00114 const Value& get(index_t index) const {
00115 DEBUG_BOUNDS(index, BIG_BAD_NUMBER);
00116 if (likely(index < size_)) {
00117 return ptr_[index];
00118 } else {
00119 return default_value_;
00120 }
00121 }
00122 };
00123
00124 #endif