Monobit Unity Networking ver.2.8.0 Server API Reference (C++)
MunIndexManager.hpp
Go to the documentation of this file.
1 
7 #ifndef __MUN_INDEX_MANAGER_HPP__
8 #define __MUN_INDEX_MANAGER_HPP__
9 
10 #include <map>
11 #include <vector>
12 #include <mrs.hpp>
13 
17 template< typename IndexKeyType, typename IndexType, typename IndexValueType >
19 {
20 protected:
22  std::map<IndexType, IndexValueType> m_IndexManager;
23 
25  std::map<IndexKeyType, IndexType> m_IndexSearchMap;
26 
28  std::map<IndexType, IndexKeyType> m_IndexKeySearchMap;
29 
31  IndexType m_GenerateIndex;
32 
34  IndexKeyType m_GenerateIndexKey;
35 
36 public:
41  std::map<IndexType, IndexValueType>* GetIndexManager(){ return &m_IndexManager; }
42 
43 public:
48  m_GenerateIndex = 1;
49  m_GenerateIndexKey = 1;
50  }
51 
55  virtual ~IndexManager() {
56  Clear();
57  }
58 
62  void Clear() {
63  m_IndexManager.clear();
64  m_IndexSearchMap.clear();
65  m_IndexKeySearchMap.clear();
66  }
67 
73  IndexType GenerateIndex( IndexType indexMax ) {
74  IndexType startIndex = m_GenerateIndex;
75  IndexType index = 0;
76 
77  do {
78  // ID候補の取得
79  index = m_GenerateIndex;
80  m_GenerateIndex++;
81 
82  // 上限に達したら 1 を設定し、循環させる
83  if( indexMax == m_GenerateIndex ) {
84  m_GenerateIndex = 1;
85  }
86 
87  // インデックス候補がインデックス情報として未登録であれば、そのIDを返す
88  if( m_IndexKeySearchMap.end() == m_IndexKeySearchMap.find(index) ) return index;
89  } while( startIndex != index );
90 
91  return 0;
92  }
93 
99  IndexKeyType GenerateIndexKey( IndexKeyType indexKeyMax ) {
100  IndexKeyType startIndexKey = m_GenerateIndexKey;
101  IndexKeyType indexKey = 0;
102 
103  do {
104  // ID候補の取得.
105  indexKey = m_GenerateIndexKey;
106  m_GenerateIndexKey++;
107 
108  // 上限に達したら 1 を設定し、循環させる
109  if( indexKeyMax == m_GenerateIndexKey ) {
110  m_GenerateIndexKey = 1;
111  }
112 
113  // インデックスキー候補がインデックス情報として未登録であれば、そのIDを返す
114  if( m_IndexSearchMap.end() == m_IndexSearchMap.find(indexKey) ) return indexKey;
115  } while( startIndexKey != indexKey );
116 
117  return 0;
118  }
119 
125  IndexType GetIndexFromKey( IndexKeyType indexKey ) {
126  typename std::map< IndexKeyType, IndexType >::iterator itr = m_IndexSearchMap.find( indexKey );
127  return ( m_IndexSearchMap.end() == itr ) ? 0 : itr->second;
128  }
129 
135  IndexValueType* GetValueFromIndex( IndexType index ) {
136  typename std::map< IndexType, IndexValueType >::iterator itr = m_IndexManager.find( index );
137  return ( m_IndexManager.end() == itr ) ? NULL : &(itr->second);
138  }
139 
145  const IndexKeyType* GetIndexKey( IndexType index ) {
146  typename std::map< IndexType, IndexKeyType >::iterator itr = m_IndexKeySearchMap.find( index );
147  return ( m_IndexKeySearchMap.end() == itr ) ? NULL : &(itr->second);
148  }
149 
158  bool Create( IndexType& index, IndexType indexMax, IndexKeyType indexKey, IndexValueType indexValue ) {
159  // インデックスキーが未登録でなければ失敗
160  IndexType _index = GetIndexFromKey( indexKey );
161  if( 0 < _index ) return false;
162 
163  // インデックスキーの生成
164  _index = GenerateIndex( indexMax );
165  if( 0 == _index ) return false;
166 
167  // インデックスマネージャへの登録
168  m_IndexManager.insert( std::pair<IndexType, IndexValueType>( _index, indexValue ) );
169  m_IndexSearchMap.insert( std::pair<IndexKeyType, IndexType>( indexKey, _index ) );
170  m_IndexKeySearchMap.insert( std::pair<IndexType, IndexKeyType>( _index, indexKey ) );
171 
172  // 取得結果を反映
173  index = _index;
174 
175  return true;
176  }
177 
182  void Delete( IndexType index ) {
183  // インデックスキーが存在しないのであれば処理しない
184  IndexValueType* pValue = GetValueFromIndex( index );
185  if( pValue == NULL ) return;
186 
187  // インデックスマネージャからの削除
188  m_IndexSearchMap.erase( m_IndexKeySearchMap[index] );
189  m_IndexManager.erase( index );
190  m_IndexKeySearchMap.erase( index );
191  }
192 
197  void GetValues( std::vector<IndexValueType>& values ) {
198  // 取得するインデックス情報について、1つずつデータを格納する
199  values.reserve( GetSize() );
200  for( typename std::map<IndexType, IndexValueType>::iterator itr = m_IndexManager.begin(); m_IndexManager.end() != itr; ++itr ) {
201  values.push_back( itr->second );
202  }
203  }
204 
209  uint32 GetSize() {
210  return m_IndexManager.size();
211  }
212 };
213 
214 #endif /* __MUN_INDEX_MANAGER_HPP__ */
IndexType m_GenerateIndex
自動生成インデックスの種.
Definition: MunIndexManager.hpp:31
virtual ~IndexManager()
デストラクタ.
Definition: MunIndexManager.hpp:55
void Delete(IndexType index)
インデックスマネージャからデータを削除する.
Definition: MunIndexManager.hpp:182
void Clear()
インデックスマネージャのクリア.
Definition: MunIndexManager.hpp:62
IndexManager()
コンストラクタ.
Definition: MunIndexManager.hpp:47
IndexValueType * GetValueFromIndex(IndexType index)
インデックスから、値情報を取得する.
Definition: MunIndexManager.hpp:135
IndexType GenerateIndex(IndexType indexMax)
インデックスの自動生成.
Definition: MunIndexManager.hpp:73
IndexType GetIndexFromKey(IndexKeyType indexKey)
インデックスキーから、インデックスを取得する.
Definition: MunIndexManager.hpp:125
インデックス管理.
Definition: MunIndexManager.hpp:18
std::map< IndexKeyType, IndexType > m_IndexSearchMap
インデックスサーチマップ.
Definition: MunIndexManager.hpp:25
std::map< IndexType, IndexKeyType > m_IndexKeySearchMap
インデックスキーサーチマップ.
Definition: MunIndexManager.hpp:28
std::map< IndexType, IndexValueType > * GetIndexManager()
インデックスマネージャの取得.
Definition: MunIndexManager.hpp:41
void GetValues(std::vector< IndexValueType > &values)
登録されているインデックス値情報を取得する.
Definition: MunIndexManager.hpp:197
bool Create(IndexType &index, IndexType indexMax, IndexKeyType indexKey, IndexValueType indexValue)
インデックスマネージャにデータを生成・追加する.
Definition: MunIndexManager.hpp:158
uint32 GetSize()
インデックスの登録数を取得する.
Definition: MunIndexManager.hpp:209
std::map< IndexType, IndexValueType > m_IndexManager
インデックスマネージャ.
Definition: MunIndexManager.hpp:22
IndexKeyType m_GenerateIndexKey
自動生成インデックスキーの種.
Definition: MunIndexManager.hpp:34
const IndexKeyType * GetIndexKey(IndexType index)
インデックスから、インデックスキーを取得する.
Definition: MunIndexManager.hpp:145
IndexKeyType GenerateIndexKey(IndexKeyType indexKeyMax)
インデックスキーの自動生成.
Definition: MunIndexManager.hpp:99