libMesh
packed_range_test.C
Go to the documentation of this file.
1 #include <libmesh/parallel.h>
2 #include <libmesh/null_output_iterator.h>
3 
4 #include <vector>
5 
6 #include "test_comm.h"
7 #include "libmesh_cppunit.h"
8 
9 
10 namespace libMesh {
11 namespace Parallel {
12 template <typename T>
13 class Packing<std::basic_string<T>> {
14 public:
15 
16  static const unsigned int size_bytes = 4;
17 
18  typedef T buffer_type;
19 
20  static unsigned int
21  get_string_len (typename std::vector<T>::const_iterator in)
22  {
23  unsigned int string_len = reinterpret_cast<const unsigned char &>(in[size_bytes-1]);
24  for (signed int i=size_bytes-2; i >= 0; --i)
25  {
26  string_len *= 256;
27  string_len += reinterpret_cast<const unsigned char &>(in[i]);
28  }
29  return string_len;
30  }
31 
32 
33  static unsigned int
34  packed_size (typename std::vector<T>::const_iterator in)
35  {
36  return get_string_len(in) + size_bytes;
37  }
38 
39  static unsigned int packable_size
40  (const std::basic_string<T> & s,
41  const void *)
42  {
43  return s.size() + size_bytes;
44  }
45 
46 
47  template <typename Iter>
48  static void pack (const std::basic_string<T> & b, Iter data_out,
49  const void *)
50  {
51  unsigned int string_len = b.size();
52  for (unsigned int i=0; i != size_bytes; ++i)
53  {
54  *data_out++ = (string_len % 256);
55  string_len /= 256;
56  }
57  std::copy(b.begin(), b.end(), data_out);
58  }
59 
60  static std::basic_string<T>
61  unpack (typename std::vector<T>::const_iterator in, void *)
62  {
63  unsigned int string_len = get_string_len(in);
64 
65  std::ostringstream oss;
66  for (unsigned int i = 0; i < string_len; ++i)
67  oss << reinterpret_cast<const unsigned char &>(in[i+size_bytes]);
68 
69  in += size_bytes + string_len;
70 
71  // std::cout << oss.str() << std::endl;
72  return std::string(oss.str());
73  }
74 
75 };
76 
77 
78 } // namespace Parallel
79 
80 } // namespace libMesh
81 
82 
83 
84 using namespace libMesh;
85 
86 class PackedRangeTest : public CppUnit::TestCase {
87 public:
88  CPPUNIT_TEST_SUITE( PackedRangeTest );
89 
90  CPPUNIT_TEST( testNullAllGather );
91  CPPUNIT_TEST( testNullSendReceive );
92  CPPUNIT_TEST( testContainerSendReceive );
93  // CPPUNIT_TEST( testAdapterSendReceive );
94  // CPPUNIT_TEST( testPointerAdapterSendReceive );
95 
96  CPPUNIT_TEST_SUITE_END();
97 
98 private:
99 
100 public:
101  void setUp()
102  {}
103 
104  void tearDown()
105  {}
106 
107 
108 
110  {
111  std::vector<processor_id_type> vals;
112 
113  std::vector<std::string> send(1);
114  if (TestCommWorld->rank() == 0)
115  send[0].assign("Hello");
116  else
117  send[0].assign("Goodbye");
118 
119  TestCommWorld->allgather_packed_range
120  ((void *)(NULL), send.begin(), send.end(),
122  }
123 
124 
126  {
127  std::vector<processor_id_type> vals;
128 
129  std::vector<std::string> send(1);
130  const unsigned int my_rank = TestCommWorld->rank();
131  const unsigned int dest_rank =
132  (my_rank + 1) % TestCommWorld->size();
133  const unsigned int source_rank =
134  (my_rank + TestCommWorld->size() - 1) % TestCommWorld->size();
135 
136  {
137  std::ostringstream os;
138  os << my_rank;
139  send[0] = os.str();
140  }
141 
142  TestCommWorld->send_receive_packed_range
143  (dest_rank, (void *)(NULL), send.begin(), send.end(),
144  source_rank, (void *)(NULL),
146  (std::string*)NULL);
147  }
148 
149 
151  {
152  std::vector<processor_id_type> vals;
153 
154  std::vector<std::string> send(1), recv;
155 
156  const unsigned int my_rank = TestCommWorld->rank();
157  const unsigned int dest_rank =
158  (my_rank + 1) % TestCommWorld->size();
159  const unsigned int source_rank =
160  (my_rank + TestCommWorld->size() - 1) % TestCommWorld->size();
161 
162  {
163  std::ostringstream os;
164  os << my_rank;
165  send[0] = os.str();
166  }
167 
168  TestCommWorld->send_receive_packed_range
169  (dest_rank, (void *)(NULL), send.begin(), send.end(),
170  source_rank, (void *)(NULL),
171  std::back_inserter(recv),
172  (std::string*)NULL);
173 
174  CPPUNIT_ASSERT_EQUAL(recv.size(), std::size_t(1));
175 
176  std::string check;
177  {
178  std::ostringstream os;
179  os << source_rank;
180  check = os.str();
181  }
182 
183  CPPUNIT_ASSERT_EQUAL(recv[0], check);
184  }
185 
186 };
187 
PackedRangeTest::testContainerSendReceive
void testContainerSendReceive()
Definition: packed_range_test.C:150
PackedRangeTest::testNullSendReceive
void testNullSendReceive()
Definition: packed_range_test.C:125
libMesh
The libMesh namespace provides an interface to certain functionality in the library.
Definition: factoryfunction.C:55
libMesh::Parallel::Packing< std::basic_string< T > >::buffer_type
T buffer_type
Definition: packed_range_test.C:18
PackedRangeTest::tearDown
void tearDown()
Definition: packed_range_test.C:104
PackedRangeTest::testNullAllGather
void testNullAllGather()
Definition: packed_range_test.C:109
TestCommWorld
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:111
PackedRangeTest
Definition: packed_range_test.C:86
PackedRangeTest::setUp
void setUp()
Definition: packed_range_test.C:101
libMesh::Parallel::Packing< std::basic_string< T > >::pack
static void pack(const std::basic_string< T > &b, Iter data_out, const void *)
Definition: packed_range_test.C:48
libMesh::Parallel::Packing< std::basic_string< T > >::unpack
static std::basic_string< T > unpack(typename std::vector< T >::const_iterator in, void *)
Definition: packed_range_test.C:61
CPPUNIT_TEST_SUITE_REGISTRATION
CPPUNIT_TEST_SUITE_REGISTRATION(PackedRangeTest)
libmesh_cppunit.h
std
Definition: float128_shims.h:27
test_comm.h
libMesh::Parallel::Packing< std::basic_string< T > >::get_string_len
static unsigned int get_string_len(typename std::vector< T >::const_iterator in)
Definition: packed_range_test.C:21
libMesh::Parallel::Packing< std::basic_string< T > >::packed_size
static unsigned int packed_size(typename std::vector< T >::const_iterator in)
Definition: packed_range_test.C:34
libMesh::null_output_iterator
A do-nothing class for templated methods that expect output iterator arguments.
Definition: null_output_iterator.h:40