KrisLibrary  1.0.0
SparseArray.h
1 #ifndef SPARSE_ARRAY_H
2 #define SPARSE_ARRAY_H
3 
4 #include <map>
5 #include <assert.h>
6 #include <KrisLibrary/File.h>
7 
12 template <class T>
14 {
15 public:
16  typedef std::map<int,T> Storage;
17  typedef typename Storage::iterator iterator;
18  typedef typename Storage::const_iterator const_iterator;
19 
20  SparseArray() :n(0) {}
21  SparseArray(size_t _n) :n(_n) {}
22  inline void resize(size_t _n) { n=_n; assert(isValid()); }
23  inline void clear() { entries.clear(); n=0; }
24  inline bool empty() const { return n==0; }
25  inline size_t size() const { return n; }
26  inline size_t numEntries() const { return entries.size(); }
27  inline iterator begin() { return entries.begin(); }
28  inline iterator end() { return entries.end(); }
29  inline const_iterator begin() const { return entries.begin(); }
30  inline const_iterator end() const { return entries.end(); }
31  inline iterator insert(int i,const T& t) {
32  std::pair<int,T> p;
33  p.first=i;
34  iterator res=entries.insert(p).first;
35  res->second=t;
36  return res;
37  }
38  inline iterator push_back(int i,const T& t) {
39  std::pair<int,T> p;
40  p.first=i;
41  iterator res=entries.insert(end(),p);
42  res->second=t;
43  return res;
44  }
45  inline iterator find(int i) { return entries.find(i); }
46  inline const_iterator find(int i) const { return entries.find(i); }
47  inline bool erase(int i) { return entries.erase(i)!=0; }
48  inline void erase(const iterator& it) { entries.erase(it); }
49  inline bool isValidIndex(int i) const { return i>=0&&i<(int)n; }
50  inline bool isValid() const
51  {
52  for(const_iterator i=entries.begin();i!=entries.end();i++)
53  if(i->first < 0 || i->first >= (int)n) return false;
54  return true;
55  }
56  bool Read(File& f)
57  {
58  if(!ReadFile(f,n)) return false;
59  size_t numEntries;
60  if(!ReadFile(f,numEntries)) return false;
61  entries.clear();
62  int index;
63  T temp;
64  for(size_t i=0;i<numEntries;i++) {
65  if(!ReadFile(f,index)) return false;
66  if(!ReadFile(f,temp)) return false;
67  insert(i,temp);
68  }
69  return true;
70  }
71  bool Write(File& f) const
72  {
73  if(!WriteFile(f,n)) return false;
74  size_t numEntries=entries.size();
75  if(!WriteFile(f,numEntries)) return false;
76  for(iterator i=begin();i!=end();i++) {
77  if(!WriteFile(i->first)) return false;
78  if(!WriteFile(i->second)) return false;
79  }
80  return true;
81  }
82 
83  Storage entries;
84  size_t n;
85 };
86 
87 
88 #endif
A sparse 1D array class.
Definition: SparseArray.h:13
bool WriteFile(File &f, const std::vector< type > &v)
WriteFile() for STL vectors. See File.h.
Definition: ioutils.h:81
A unified interface for reading/writing binary data to file.
bool ReadFile(File &f, std::vector< type > &v)
ReadFile() for STL vectors. See File.h.
Definition: ioutils.h:69
A cross-platform class for reading/writing binary data.
Definition: File.h:47