EpetraExt 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#if defined(EpetraExt_SHOW_DEPRECATED_WARNINGS)
45#ifdef __GNUC__
46#warning "The EpetraExt package is deprecated"
47#endif
48#endif
49
50// ---------- Standard Includes ----------
51
52#include <string>
53#include <vector>
54
55// ---------- Xyce Includes ----------
56
57// ---------- Other Includes ----------
58
59// ---------- Fwd Declarations ----------
60
61namespace EpetraExt {
62
67template <typename T>
69{
76 static size_t size( T const & object )
77 { return object.packedByteCount(); }
78
86 static void pack( T const & object, char * buf, size_t size, int & pos )
87 { object.pack( buf, size, pos ); }
88
96 static void unpack( T & object, char * buf, size_t size, int & pos )
97 { object.unpack( buf, size, pos ); }
98};
99
101
103template <>
104struct PackTraits<std::string>
105{
106 static size_t size( std::string const & object )
107 { return object.length() + sizeof(size_t); }
108
109 static void pack( std::string const & object, char * buf, size_t size, int & pos )
110 {
111 size_t len = object.length();
112 std::memcpy( buf+pos, &len, sizeof(size_t) );
113 pos += sizeof(size_t);
114 std::memcpy( buf+pos, object.c_str(), len );
115 pos += len;
116 }
117
118 static void unpack( std::string & object, char * buf, size_t size, int & pos )
119 {
120 size_t len;
121 std::memcpy( &len, buf+pos, sizeof(size_t) );
122 pos += sizeof(size_t);
123 object = std::string( buf+pos, len );
124 pos += len;
125 }
126};
127
129
132template <typename T>
133struct PackTraits< std::vector<T> >
134{
135 static size_t size( std::vector<T> const & object )
136 { return object.size() * sizeof(T) + sizeof(size_t); }
137
138 static void pack( std::vector<T> const & object, char * buf, size_t size, int & os )
139 {
140 size_t len = object.size();
141 std::memcpy( buf+pos, &len, sizeof(size_t) );
142 pos += sizeof(size_t);
143 std::memcpy( buf+pos, &object[0], len*sizeof(T) );
144 pos += len*sizeof(T);
145 }
146
147 static void unpack( std::vector<T> & object, char * buf, int size, int & pos )
148 {
149 size_t len;
150 std::memcpy( &len, buf+pos, sizeof(size_t) );
151 pos += sizeof(size_t);
152 object.resize(len);
153 std::memcpy( &object[0], buf+pos, len*sizeof(T) );
154 pos += len*sizeof(T);
155 }
156};
157
158} //namespace EpetraExt
159
160#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.