Faster  0.0.4Alpha
Superfastdistributtedcomputing
fastCommBuffer.h
1 #ifndef LIBFASTER_FASTCOMMBUFFER_H
2 #define LIBFASTER_FASTCOMMBUFFER_H
3 
4 
5 #include <vector>
6 #include <cstring>
7 #include <iostream>
8 #include <tuple>
9 
10 #include "misc.h"
11 
12 namespace faster {
13  const int BUFFER_INITIAL_SIZE = 512*1024;
14 
16  private:
17  char * _data;
18  size_t _size;
19  size_t _allocatedSize;
20  bool _ownData;
21 
22  public:
24  fastCommBuffer(size_t s);
25  ~fastCommBuffer();
26 
27  void setBuffer(void * buffer, size_t s);
28  void reset();
29 
30  char * data();
31  char * pos();
32  char * pos(size_t pos);
33  size_t size();
34  size_t free();
35  void advance(size_t pos);
36 
37  void grow(size_t s);
38 
39  void print();
40 
41  // WRITE Data
42  template <typename T>
43  void write(T &v, size_t s){
44  grow(_size + s);
45  //std::memcpy( &_data[_size], &v, s );
46  std::copy( (char*)&v, ((char*)&v) + s , _data+_size );
47 
48  //char * p = (char*) &v;
49  //for ( size_t i = 0; i < s; i++){
50  //_data[_size + i] = p[i];
51  //}
52 
53  _size += s;
54  }
55  template <typename T>
56  void writePos(const T &v, size_t s, size_t pos){
57  grow(pos + s);
58  //std::memcpy( &_data[pos], (char*) &v, s );
59  std::copy((char*) &v, ((char*)&v) + s, _data + pos);
60  //char * p = (char*) &v;
61  //for ( size_t i = 0; i < s; i++){
62  //_data[_size + i] = p[i];
63  //}
64 
65  if(_size < pos+s)
66  _size = pos+s;
67  }
68  template <typename T>
69  void writePos(const T &v, size_t pos){
70  writePos(v, sizeof(T), pos);
71  }
72 
73  template <typename T>
74  inline void writeSafe(T * v, size_t s){
75  //std::memcpy( &_data[_size], v, s );
76  std::copy( (char*)v, ((char*)v) + s, &_data[_size]);
77  //char * p = (char*) &v;
78  //for ( size_t i = 0; i < s; i++){
79  // _data[_size + i] = p[i];
80  //}
81 
82  _size += s;
83  }
84  template <typename T>
85  inline void write(T * v, size_t s){
86  grow(_size + s);
87  writeSafe(v, s);
88  }
89  /*void write(void * v, size_t s){
90  std::memcpy( &_data[_size], v, s );
91  _size += s;
92  }// */
93 
94  template <typename T>
95  void write(T v){
96  write( v, sizeof(T) );
97  }
98  void write(std::string i){
99  size_t s = i.length();
100  grow(_size + sizeof(size_t) + s );
101  writeSafe( &s, sizeof(size_t) );
102  writeSafe( i.data(), s );
103  }
104  template <typename T>
105  void write(std::vector<T> v){
106  size_t s = v.size();
107  grow(_size + sizeof(size_t) + s * sizeof(T));
108  writeSafe( &s, sizeof(size_t) );
109  writeSafe( v.data(), s * sizeof(T) );
110  }
111  template <typename K, typename T>
112  void write(std::pair<K,T> p){
113  write(p.first);
114  write(p.second);
115  }
116  template <typename K, typename T>
117  void write(std::tuple<K,T, size_t> t){
118  write(std::get<0>(t));
119  write(std::get<1>(t));
120  write(std::get<2>(t));
121  }
122  void write(procstat &s);
123  void writePos(procstat &s, size_t pos);
124  void read(procstat &s);
125  void advance(procstat &s);
126 
127  // READ Data
128  template <typename T>
129  void read(T & v, size_t s){
130  //std::memcpy(&v, &_data[_size], s );
131  std::copy(_data + _size, _data + _size + s, (char*) &v);
132  //char * p = (char*) &v;
133  //for ( size_t i = 0; i < s; i++){
134  //p[i] = _data[_size + i];
135  //}
136  _size += s;
137  }
138  template <typename T>
139  void read(T * v, size_t s){
140  //std::memcpy((char*)v, &_data[_size], s );
141  std::copy(_data + _size, _data + _size + s, (char*) v);
142  //char * p = (char*) &v;
143  //for ( size_t i = 0; i < s; i++){
144  //p[i] = _data[_size + i];
145  //}
146  _size += s;
147  }
148  template <typename T>
149  void read(T & v){
150  read( &v, sizeof(T) );
151  }
152  template <typename T>
153  void readVec(std::vector<T> & v, size_t s){
154  v.assign((T*) &_data[_size], (T*) &_data[_size + s] );
155  _size += s;
156  }
157  void readString(std::string & v, size_t s){
158  v.assign( &_data[_size], &_data[_size] + s );
159  _size += s;
160  }
161  template <typename T>
162  void read(std::vector<T> & v){
163  size_t size;
164  read(size);
165  readVec(v, size*sizeof(T));
166  }
167  void read(std::string & s){
168  size_t size;
169  read(size);
170  readString(s, size);
171  }
172  template <typename K, typename T>
173  void read(std::pair<K,T> & p){
174  read(p.first);
175  read(p.second);
176  }
177  template <typename K, typename T>
178  void read(std::tuple<K,T, size_t> & t){
179  K k;
180  T type;
181  size_t s;
182  read(k);
183  read(type);
184  read(s);
185  t = std::make_tuple (k,type,s);
186  }
187 
188  // Operators
189 
190  template <typename T>
191  fastCommBuffer & operator<<(T v){
192  write(v);
193  return *this;
194  }
195 
196  template <typename T>
197  fastCommBuffer & operator>>(T & v){
198  read(v);
199  return *this;
200  }
201 
202 
203  };
204 }
205 
206 #endif
Definition: misc.h:15
Definition: fastCommBuffer.h:15
Definition: _workerFdd.h:11