1 /* 2 * This file is part of the GROMACS molecular simulation package. 3 * 4 * Copyright (c) 2016,2017,2018,2019,2020, by the GROMACS development team, led by 5 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, 6 * and including many others, as listed in the AUTHORS file in the 7 * top-level source directory and at http://www.gromacs.org. 8 * 9 * GROMACS is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public License 11 * as published by the Free Software Foundation; either version 2.1 12 * of the License, or (at your option) any later version. 13 * 14 * GROMACS is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with GROMACS; if not, see 21 * http://www.gnu.org/licenses, or write to the Free Software Foundation, 22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 23 * 24 * If you want to redistribute modifications to GROMACS, please 25 * consider that scientific software is very special. Version 26 * control is crucial - bugs must be traceable. We will be happy to 27 * consider code for inclusion in the official distribution, but 28 * derived work must not be called official GROMACS. Details are found 29 * in the README & COPYING files - if they are missing, get the 30 * official version at http://www.gromacs.org. 31 * 32 * To help us fund GROMACS development, we humbly ask that you cite 33 * the research papers on the package. Check out http://www.gromacs.org. 34 */ 35 /*! \libinternal \file 36 * \brief 37 * Declares a generic serialization interface that supports both directions. 38 * 39 * \todo Generalize and transfer serialization functionality used in 40 * mrc density file header serialization to here. 41 * 42 * \author Teemu Murtola <teemu.murtola@gmail.com> 43 * \inlibraryapi 44 * \ingroup module_utility 45 */ 46 #ifndef GMX_UTILITY_ISERIALIZER_H 47 #define GMX_UTILITY_ISERIALIZER_H 48 49 #include <cstddef> 50 51 #include <string> 52 53 #include "gromacs/math/vectypes.h" 54 #include "gromacs/utility/basedefinitions.h" 55 #include "gromacs/utility/real.h" 56 #include "gromacs/utility/smalloc.h" 57 58 namespace gmx 59 { 60 61 /*! \libinternal 62 * \brief Interface for types that convert standard data types into a 63 * form suitable for storage or transfer. 64 * 65 * Different implementations could suit MPI, file I/O, or in-memory 66 * conversion. */ 67 class ISerializer 68 { 69 public: ~ISerializer()70 virtual ~ISerializer() {} 71 /*! \brief Returns whether the serializer is reading or 72 * writing, because details like memory management vary 73 * accordingly. */ 74 virtual bool reading() const = 0; 75 //! \brief Serialize values of different types. 76 ///@{ 77 virtual void doBool(bool* value) = 0; 78 virtual void doUChar(unsigned char* value) = 0; 79 virtual void doChar(char* value) = 0; 80 virtual void doUShort(unsigned short* value) = 0; 81 virtual void doInt(int* value) = 0; 82 virtual void doInt32(int32_t* value) = 0; 83 virtual void doInt64(int64_t* value) = 0; 84 virtual void doFloat(float* value) = 0; 85 virtual void doDouble(double* value) = 0; 86 virtual void doReal(real* value) = 0; 87 virtual void doIvec(ivec* value) = 0; 88 virtual void doRvec(rvec* value) = 0; 89 virtual void doString(std::string* value) = 0; 90 virtual void doOpaque(char* data, std::size_t size) = 0; 91 ///@} 92 93 //! \brief Serialize arrays of values of different types. 94 ///@{ doBoolArray(bool * values,int elements)95 void doBoolArray(bool* values, int elements) 96 { 97 for (int i = 0; i < elements; i++) 98 { 99 doBool(&(values[i])); 100 } 101 } 102 // Char, UChar and RVec have vector specializations that can be 103 // used instead of the default looping. doCharArray(char * values,int elements)104 virtual void doCharArray(char* values, int elements) 105 { 106 for (int i = 0; i < elements; i++) 107 { 108 doChar(&(values[i])); 109 } 110 } doUCharArray(unsigned char * values,int elements)111 virtual void doUCharArray(unsigned char* values, int elements) 112 { 113 for (int i = 0; i < elements; i++) 114 { 115 doUChar(&(values[i])); 116 } 117 } doUShortArray(unsigned short * values,int elements)118 void doUShortArray(unsigned short* values, int elements) 119 { 120 for (int i = 0; i < elements; i++) 121 { 122 doUShort(&(values[i])); 123 } 124 } doIntArray(int * values,int elements)125 void doIntArray(int* values, int elements) 126 { 127 for (int i = 0; i < elements; i++) 128 { 129 doInt(&(values[i])); 130 } 131 } doInt32Array(int32_t * values,int elements)132 void doInt32Array(int32_t* values, int elements) 133 { 134 for (int i = 0; i < elements; i++) 135 { 136 doInt32(&(values[i])); 137 } 138 } doInt64Array(int64_t * values,int elements)139 void doInt64Array(int64_t* values, int elements) 140 { 141 for (int i = 0; i < elements; i++) 142 { 143 doInt64(&(values[i])); 144 } 145 } doFloatArray(float * values,int elements)146 void doFloatArray(float* values, int elements) 147 { 148 for (int i = 0; i < elements; i++) 149 { 150 doFloat(&(values[i])); 151 } 152 } doDoubleArray(double * values,int elements)153 void doDoubleArray(double* values, int elements) 154 { 155 for (int i = 0; i < elements; i++) 156 { 157 doDouble(&(values[i])); 158 } 159 } doRealArray(real * values,int elements)160 void doRealArray(real* values, int elements) 161 { 162 for (int i = 0; i < elements; i++) 163 { 164 doReal(&(values[i])); 165 } 166 } doIvecArray(ivec * values,int elements)167 void doIvecArray(ivec* values, int elements) 168 { 169 for (int i = 0; i < elements; i++) 170 { 171 doIvec(&(values[i])); 172 } 173 } doRvecArray(rvec * values,int elements)174 virtual void doRvecArray(rvec* values, int elements) 175 { 176 for (int i = 0; i < elements; i++) 177 { 178 doRvec(&(values[i])); 179 } 180 } 181 ///@} 182 }; 183 184 } // namespace gmx 185 186 #endif 187