EpetraExt Package Browser (Single Doxygen Collection) Development
Loading...
Searching...
No Matches
EpetraExt_PackTraits.h
Go to the documentation of this file.
1//@HEADER
2// ***********************************************************************
3//
4// EpetraExt: Epetra Extended - Linear Algebra Services Package
5// Copyright (2011) Sandia Corporation
6//
7// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8// the U.S. Government retains certain rights in this software.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38//
39// ***********************************************************************
40//@HEADER
41#ifndef EPETRAEXT_PACKTRAITS_H
42#define EPETRAEXT_PACKTRAITS_H
43
44// ---------- Standard Includes ----------
45
46#include <string>
47#include <vector>
48
49// ---------- Xyce Includes ----------
50
51// ---------- Other Includes ----------
52
53// ---------- Fwd Declarations ----------
54
55namespace EpetraExt {
56
61template <typename T>
63{
70 static size_t size( T const & object )
71 { return object.packedByteCount(); }
72
80 static void pack( T const & object, char * buf, size_t size, int & pos )
81 { object.pack( buf, size, pos ); }
82
90 static void unpack( T & object, char * buf, size_t size, int & pos )
91 { object.unpack( buf, size, pos ); }
92};
93
95
97template <>
98struct PackTraits<std::string>
99{
100 static size_t size( std::string const & object )
101 { return object.length() + sizeof(size_t); }
102
103 static void pack( std::string const & object, char * buf, size_t size, int & pos )
104 {
105 size_t len = object.length();
106 std::memcpy( buf+pos, &len, sizeof(size_t) );
107 pos += sizeof(size_t);
108 std::memcpy( buf+pos, object.c_str(), len );
109 pos += len;
110 }
111
112 static void unpack( std::string & object, char * buf, size_t size, int & pos )
113 {
114 size_t len;
115 std::memcpy( &len, buf+pos, sizeof(size_t) );
116 pos += sizeof(size_t);
117 object = std::string( buf+pos, len );
118 pos += len;
119 }
120};
121
123
126template <typename T>
127struct PackTraits< std::vector<T> >
128{
129 static size_t size( std::vector<T> const & object )
130 { return object.size() * sizeof(T) + sizeof(size_t); }
131
132 static void pack( std::vector<T> const & object, char * buf, size_t size, int & os )
133 {
134 size_t len = object.size();
135 std::memcpy( buf+pos, &len, sizeof(size_t) );
136 pos += sizeof(size_t);
137 std::memcpy( buf+pos, &object[0], len*sizeof(T) );
138 pos += len*sizeof(T);
139 }
140
141 static void unpack( std::vector<T> & object, char * buf, int size, int & pos )
142 {
143 size_t len;
144 std::memcpy( &len, buf+pos, sizeof(size_t) );
145 pos += sizeof(size_t);
146 object.resize(len);
147 std::memcpy( &object[0], buf+pos, len*sizeof(T) );
148 pos += len*sizeof(T);
149 }
150};
151
152} //namespace EpetraExt
153
154#endif
EpetraExt::BlockCrsMatrix: A class for constructing a distributed block matrix.
static size_t size(std::string const &object)
static void pack(std::string const &object, char *buf, size_t size, int &pos)
static void unpack(std::string &object, char *buf, size_t size, int &pos)
static void unpack(std::vector< T > &object, char *buf, int size, int &pos)
static void pack(std::vector< T > const &object, char *buf, size_t size, int &os)
static size_t size(std::vector< T > const &object)
Traits for packing and unpacking of data into char buffers for communication.
static void unpack(T &object, char *buf, size_t size, int &pos)
Unpacks object from char buffer.
static void pack(T const &object, char *buf, size_t size, int &pos)
Packs object into char buffer.
static size_t size(T const &object)
Returns size in byte necessary to pack datatype.