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 143 of file CompressData.cpp.

145 {
146  // Convert from base64 to binary.
147  typedef boost::archive::iterators::transform_width<
148  boost::archive::iterators::binary_from_base64<
149  std::string::const_iterator>,
150  8, 6>
151  binary_t;
152  compressedDataString = std::string(binary_t(base64string.begin()),
153  binary_t(base64string.end()));
154 }

Referenced by ZlibDecodeFromBase64Str().

◆ 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 114 of file CompressData.cpp.

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

Referenced by ZlibEncodeToBase64Str().

◆ 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 101 of file CompressData.cpp.

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

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

Referenced by Nektar::LibUtilities::FieldIOXml::ImportFieldData(), Nektar::LibUtilities::FieldIOXml::ImportFieldDefs(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_ReadCurves(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_ReadEdges(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_ReadElements1D(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_ReadElements2D(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_ReadElements3D(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_ReadFaces(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_ReadVertices(), Nektar::LibUtilities::FieldIOXml::v_Write(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WriteCurves(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WriteEdges(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WriteHexs(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WritePrisms(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WritePyrs(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WriteQuads(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WriteTets(), Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WriteTris(), and Nektar::SpatialDomains::MeshGraphXmlCompressed::v_WriteVertices().

◆ 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 147 of file CompressData.h.

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

References ASSERTL0, CHUNK, and Nektar::void.

Referenced by ZlibDecodeFromBase64Str().

◆ 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 73 of file CompressData.h.

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

References ASSERTL0, CHUNK, and Nektar::void.

Referenced by ZlibEncodeToBase64Str().

◆ ZlibEncodeToBase64Str()

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