Proto
Proto_PointLIO.H
1 #ifndef __PROTO_SPMD_H__
2 #define __PROTO_SPMD_H__
3 
4 #include "Proto_Point.H"
5 #include <vector>
6 
7 #ifdef PROTO_CUDA
8 #include "implem/Proto_DisjointBoxLayout.H"
9 #endif
10 
11 namespace Proto
12 {
13 
14  template <class T>
15  int linearSize(const T& inputT);
16 
17  template <class T>
18  void linearIn(T& a_outputT, const void* const inBuf);
19 
20  template <class T>
21  void linearOut(void* const a_outBuf, const T& inputT);
22 
23 
24 
25  //=========== specializations =============================
26 
27  template < >
28  void linearIn<std::vector<Point>>(std::vector<Point>& a_outputT, const void* const a_inBuf)
29  {
30  std::size_t* buffer = (std::size_t*)a_inBuf;
31  a_outputT.resize(*buffer);
32  char* bufferC = (char*)a_inBuf;
33  bufferC+=sizeof(std::size_t);
34  memcpy(a_output_T.data(), bufferC, sizeof(Point)*(*buffer));
35  }
36 
37  template < >
38  void linearOut<std::vector<Point>>(void* const a_outBuf, const std::vector<Point>& a_inputT)
39  {
40  std::size_t length = &((std::size_t*)a_outBuf);
41  length= a_inputT.size();
42  char* buffer = (char*)a_outBuf;
43  buffer += sizeof(std::size_t);
44  memcpy(buffer, a_inputT.data(), sizeof(Point)*length);
45  }
46 
47  template < >
48  int linearSize<std::vector<Point>>(const std::vector<Point>& a_input)
49  {
50  return sizeof(std::size_t)+a_input.size()*sizeof(Point);
51  }
52  //=======================default implementations
53 
54  template <class T>
55  int linearSize(const T& inputT)
56  {
57  return inputT.linearSize();
58  }
59 
60  template <class T>
61  void linearIn(T& a_outputT, const void* const inBuf)
62  {
63  a_outputT.linearIn(inBuf);
64  }
65 
66  template <class T>
67  void linearOut(void* const a_outBuf, const T& inputT)
68  {
69  inputT.linearOut(a_outBuf);
70  }
71 
72 
73 } // end namespace Proto
74 
75 #endif // __PROTO_SPMD_H__
Definition: Proto_Box.H:11