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