Nektar++
Functions
Nektar::LibUtilities::CompressData Namespace Reference

Functions

std::string GetCompressString (void)
 
std::string GetBitSizeStr (void)
 
void BinaryStrToBase64Str (std::string &compressedDataString, std::string &base64string)
 
void Base64StrToBinaryStr (std::string &base64string, std::string &compressedDataString)
 
template<class T >
int ZlibEncode (std::vector< T > &in, std::string &out)
 
template<class T >
int ZlibEncodeToBase64Str (std::vector< T > &in, std::string &out64)
 
template<class T >
int ZlibDecode (std::string &in, std::vector< T > &out)
 
template<class T >
int ZlibDecodeFromBase64Str (std::string &in64, std::vector< T > &out)
 

Function Documentation

◆ Base64StrToBinaryStr()

void Nektar::LibUtilities::CompressData::Base64StrToBinaryStr ( std::string &  base64string,
std::string &  compressedDataString 
)

Convert a Base 64 string into a binary string

Convert a string containing base 64 (i.e. from xml file) into a binary string

Definition at line 138 of file CompressData.cpp.

Referenced by ZlibDecode(), and ZlibDecodeFromBase64Str().

140  {
141  // Convert from base64 to binary.
142  typedef boost::archive::iterators::transform_width<
143  boost::archive::iterators::binary_from_base64<
144  std::string::const_iterator>, 8, 6 > binary_t;
145  compressedDataString = std::string(binary_t(base64string.begin()),
146  binary_t(base64string.end()));
147  }

◆ BinaryStrToBase64Str()

void Nektar::LibUtilities::CompressData::BinaryStrToBase64Str ( std::string &  compressedDataString,
std::string &  base64string 
)

Convert a binary string to Base 64 string

Convert a string containing compressed binary (i.e. from deflate) into a base 64 string

Definition at line 110 of file CompressData.cpp.

Referenced by ZlibEncode(), and ZlibEncodeToBase64Str().

112  {
113  // If the string length is not divisible by 3,
114  // pad it. There is a bug in transform_width
115  // that will make it reference past the end
116  // and crash.
117  switch (compressedDataString.length() % 3)
118  {
119  case 1:
120  compressedDataString += '\0';
121  /* Falls through. */
122  case 2:
123  compressedDataString += '\0';
124  break;
125  }
126 
127  // Convert from binary to base64.
128  typedef boost::archive::iterators::base64_from_binary<
129  boost::archive::iterators::transform_width<
130  std::string::const_iterator, 6, 8> > base64_t;
131  base64string = std::string(base64_t(compressedDataString.begin()),
132  base64_t(compressedDataString.end()));
133  }

◆ GetBitSizeStr()

std::string Nektar::LibUtilities::CompressData::GetBitSizeStr ( void  )

◆ GetCompressString()

std::string Nektar::LibUtilities::CompressData::GetCompressString ( void  )

Return a string describing this compression and endianness

Definition at line 97 of file CompressData.cpp.

References Nektar::LibUtilities::Endianness(), and Nektar::LibUtilities::EndianTypeMap.

Referenced by Nektar::LibUtilities::FieldIOXml::ImportFieldData(), Nektar::LibUtilities::FieldIOXml::ImportFieldDefs(), Nektar::SpatialDomains::MeshGraphXmlCompressed::ReadCurves(), Nektar::SpatialDomains::MeshGraphXmlCompressed::ReadEdges(), Nektar::SpatialDomains::MeshGraphXmlCompressed::ReadElements1D(), Nektar::SpatialDomains::MeshGraphXmlCompressed::ReadElements2D(), Nektar::SpatialDomains::MeshGraphXmlCompressed::ReadElements3D(), Nektar::SpatialDomains::MeshGraphXmlCompressed::ReadFaces(), Nektar::SpatialDomains::MeshGraphXmlCompressed::ReadVertices(), Nektar::LibUtilities::FieldIOXml::v_Write(), Nektar::SpatialDomains::MeshGraphXmlCompressed::WriteCurves(), Nektar::SpatialDomains::MeshGraphXmlCompressed::WriteEdges(), Nektar::SpatialDomains::MeshGraphXmlCompressed::WriteHexs(), Nektar::SpatialDomains::MeshGraphXmlCompressed::WritePrisms(), Nektar::SpatialDomains::MeshGraphXmlCompressed::WritePyrs(), Nektar::SpatialDomains::MeshGraphXmlCompressed::WriteQuads(), Nektar::SpatialDomains::MeshGraphXmlCompressed::WriteTets(), Nektar::SpatialDomains::MeshGraphXmlCompressed::WriteTris(), and Nektar::SpatialDomains::MeshGraphXmlCompressed::WriteVertices().

98  {
99  return "B64Z-"+ EndianTypeMap[Endianness()];
100  }
EndianType Endianness(void)
const std::string EndianTypeMap[]
Definition: CompressData.h:59

◆ ZlibDecode()

template<class T >
int Nektar::LibUtilities::CompressData::ZlibDecode ( std::string &  in,
std::vector< T > &  out 
)

Decompress a zlib-compressed string into a vector of NekDouble values.

Definition at line 155 of file CompressData.h.

References ASSERTL0, Base64StrToBinaryStr(), CHUNK, LIB_UTILITIES_EXPORT, and Nektar::void.

Referenced by ZlibDecodeFromBase64Str().

156  {
157  int ret;
158  unsigned have;
159  z_stream strm;
160  std::string buffer;
161  buffer.resize(CHUNK);
162  std::string output;
163 
164  strm.zalloc = Z_NULL;
165  strm.zfree = Z_NULL;
166  strm.opaque = Z_NULL;
167  strm.avail_in = 0;
168  strm.next_in = Z_NULL;
169  ret = inflateInit(&strm);
170  ASSERTL0(ret == Z_OK, "Error initializing zlib decompression.");
171 
172  strm.avail_in = (unsigned int)in.size();
173  strm.next_in = (unsigned char*)(&in[0]);
174 
175  do {
176  strm.avail_out = CHUNK;
177  strm.next_out = (unsigned char*)(&buffer[0]);
178 
179  ret = inflate(&strm, Z_NO_FLUSH);
180 
181  ASSERTL0(ret != Z_STREAM_ERROR, "Stream error occured.");
182 
183  switch (ret) {
184  case Z_NEED_DICT:
185  ret = Z_DATA_ERROR;
186  /* Falls through. */
187  case Z_DATA_ERROR:
188  case Z_MEM_ERROR:
189  (void)inflateEnd(&strm);
190  return ret;
191  }
192 
193  have = CHUNK - strm.avail_out;
194  output += buffer.substr(0, have);
195 
196  } while (strm.avail_out == 0);
197 
198  (void)inflateEnd(&strm);
199 
200  if (ret == Z_STREAM_END)
201  {
202  T* readFieldData = (T*) output.c_str();
203  unsigned int len = (unsigned int)output.size() * sizeof(*output.c_str())
204  / sizeof(T);
205  out.assign( readFieldData, readFieldData + len);
206  return Z_OK;
207  }
208  else
209  {
210  return Z_DATA_ERROR;
211  }
212  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
array buffer
Definition: GsLib.hpp:61
#define CHUNK
Definition: CompressData.h:43

◆ ZlibDecodeFromBase64Str()

template<class T >
int Nektar::LibUtilities::CompressData::ZlibDecodeFromBase64Str ( std::string &  in64,
std::vector< T > &  out 
)

◆ ZlibEncode()

template<class T >
int Nektar::LibUtilities::CompressData::ZlibEncode ( std::vector< T > &  in,
std::string &  out 
)

Compress a vector of NekDouble values into a string using zlib.

Definition at line 78 of file CompressData.h.

References ASSERTL0, BinaryStrToBase64Str(), CHUNK, LIB_UTILITIES_EXPORT, and Nektar::void.

Referenced by ZlibEncodeToBase64Str().

79  {
80  int ret;
81  unsigned have;
82  std::string buffer;
83  buffer.resize(CHUNK);
84  z_stream strm;
85  unsigned char* input = (unsigned char*)(&in[0]);
86 
87  /* allocate deflate state */
88  strm.zalloc = Z_NULL;
89  strm.zfree = Z_NULL;
90  strm.opaque = Z_NULL;
91  ret = deflateInit(&strm, Z_DEFAULT_COMPRESSION);
92 
93  ASSERTL0(ret == Z_OK, "Error initializing Zlib.");
94 
95  strm.avail_in = (unsigned int)in.size() * sizeof(T) / sizeof(char);
96  strm.next_in = input;
97 
98  // Deflate input until output buffer is no longer full.
99  do {
100  strm.avail_out = CHUNK;
101  strm.next_out = (unsigned char*)(&buffer[0]);
102 
103  ret = deflate(&strm, Z_FINISH);
104 
105  // Deflate can return Z_OK, Z_STREAM_ERROR, Z_BUF_ERROR or
106  // Z_STREAM_END. All, except Z_STREAM_ERROR are ok.
107  ASSERTL0(ret != Z_STREAM_ERROR, "Zlib stream error");
108 
109  have = CHUNK - strm.avail_out;
110  out += buffer.substr(0, have);
111 
112  } while (strm.avail_out == 0);
113 
114  // Check all input was processed.
115  ASSERTL0(strm.avail_in == 0, "Not all input was used.");
116 
117  // Check stream is complete.
118  ASSERTL0(ret == Z_STREAM_END, "Stream not finished");
119 
120  // Clean-up and return
121  (void)deflateEnd(&strm);
122  return Z_OK;
123  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
array buffer
Definition: GsLib.hpp:61
#define CHUNK
Definition: CompressData.h:43

◆ ZlibEncodeToBase64Str()

template<class T >
int Nektar::LibUtilities::CompressData::ZlibEncodeToBase64Str ( std::vector< T > &  in,
std::string &  out64 
)