Go to the documentation of this file.00001
00002
00003
00004
00005 #ifndef __index_vector_h_
00006 #define __index_vector_h_
00007
00008
00009
00010
00011
00012
00013 template <class T>
00014 class CStaticVectorMap
00015 {
00016
00017
00018
00019 vector< DWORD > m_Keys;
00020
00021
00022 vector< T > m_Base;
00023
00024 public:
00025 typedef typename vector<T>::const_iterator const_iter_t;
00026
00027
00028 const_iter_t GetVectorEnd (DWORD VectorNo) const
00029 {
00030 return ( VectorNo+1 == m_Keys.size() )
00031 ? m_Base.end()
00032 : m_Base.begin() + m_Keys[VectorNo + 1];
00033 }
00034 const_iter_t GetVectorBegin (DWORD VectorNo) const
00035 {
00036 assert(VectorNo < m_Keys.size());
00037 return m_Base.begin() + m_Keys[VectorNo];
00038 }
00039 DWORD GetVectorLength (DWORD VectorNo) const
00040 {
00041 const_iter_t begin = GetVectorBegin(VectorNo);
00042 const_iter_t end = GetVectorEnd(VectorNo);
00043 return end - begin;
00044 }
00045
00046 DWORD size() const
00047 {
00048 return m_Keys.size();
00049 }
00050
00051 bool empty() const
00052 {
00053 return m_Keys.empty();
00054 }
00055
00056 void Create(vector< vector<T> >& src)
00057 {
00058 m_Keys.resize( src.size() );
00059 m_Base.clear();
00060 for (DWORD i = 0; i < src.size(); i++)
00061 {
00062 m_Keys[i] = m_Base.size();
00063 m_Base.insert(m_Base.end(), src[i].begin(), src[i].end());
00064 };
00065 }
00066
00067
00068 bool LoadVectorMap(string filename)
00069 {
00070 FILE* fp;
00071 try
00072 {
00073 fp = fopen(filename.c_str(), "rb");
00074 if (!fp)
00075 return false;
00076
00077 DWORD Length;
00078 fread ((void *)&Length, 1, sizeof(DWORD), fp);
00079 assert(Length > 0);
00080 m_Keys.clear();
00081 ReadVectorInner(fp, m_Keys, Length);
00082
00083
00084 fread ((void *)&Length, 1, sizeof(DWORD), fp);
00085 m_Base.clear();
00086 ReadVectorInner(fp, m_Base, Length);
00087
00088 fclose (fp);
00089 }
00090 catch(...)
00091 {
00092 return false;
00093 }
00094 return true;
00095 }
00096
00097 bool SaveVectorMap(string filename)
00098 {
00099 try
00100 {
00101 FILE* fp = fopen(filename.c_str(), "wb");
00102 if (!fp)
00103 return(false);
00104
00105 DWORD nCount = m_Keys.size();
00106 fwrite((void *)&nCount, sizeof(DWORD), 1, fp);
00107 WriteVectorInner(fp, m_Keys);
00108
00109 nCount = m_Base.size();
00110 fwrite ((void *)&nCount, sizeof(DWORD), 1, fp);
00111 WriteVectorInner(fp, m_Base);
00112
00113 fclose(fp);
00114 }
00115 catch(...)
00116 {
00117 return false;
00118 }
00119 return true;
00120 }
00121
00122 size_t GetBaseSize() const
00123 {
00124 return m_Base.size();
00125 };
00126
00127 bool GetKeyByBaseNo(DWORD BaseNo, DWORD& KeyNo, DWORD& DataNo) const
00128 {
00129 KeyNo = 0;
00130 if (BaseNo != 0)
00131 {
00132 vector<DWORD>::const_iterator it = lower_bound(m_Keys.begin(), m_Keys.end(), BaseNo);
00133 if (it == m_Keys.begin()) return false;
00134 if (it == m_Keys.end()) return false;
00135 if (BaseNo < *it) it--;
00136 KeyNo = it - m_Keys.begin();
00137 };
00138 DataNo = BaseNo - m_Keys[KeyNo];
00139 return true;
00140 };
00141
00142
00143
00144 };
00145
00146
00147 #endif