8#ifndef INCLUDED_BSLX_GENERICOUTSTREAM
9#define INCLUDED_BSLX_GENERICOUTSTREAM
333#include <bslscm_version.h>
342#include <bsl_cstddef.h>
343#include <bsl_string.h>
344#include <bsl_vector.h>
362template <
class STREAMBUF>
379 k_SIZEOF_FLOAT64 = 8,
384 STREAMBUF *d_streamBuf;
386 int d_versionSelector;
816 operator const void *()
const;
835template <
class STREAMBUF,
class TYPE>
848template <
class STREAMBUF>
856template <
class STREAMBUF>
860: d_streamBuf(streamBuf)
861, d_versionSelector(versionSelector)
867template <
class STREAMBUF>
874template <
class STREAMBUF>
880 if (0 == d_streamBuf->pubsync()) {
887template <
class STREAMBUF>
894template <
class STREAMBUF>
902 putInt32(length | (1 << 31));
910template <
class STREAMBUF>
915 return putUint8(version);
920template <
class STREAMBUF>
932#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
933 const char *rawBytes =
reinterpret_cast<char *
>(&value);
934 char bytes[k_SIZEOF_INT64];
936 bytes[0] = rawBytes[7];
937 bytes[1] = rawBytes[6];
938 bytes[2] = rawBytes[5];
939 bytes[3] = rawBytes[4];
940 bytes[4] = rawBytes[3];
941 bytes[5] = rawBytes[2];
942 bytes[6] = rawBytes[1];
943 bytes[7] = rawBytes[0];
946 reinterpret_cast<char *
>(&value) +
sizeof value - k_SIZEOF_INT64;
949 if (k_SIZEOF_INT64 == d_streamBuf->sputn(bytes, k_SIZEOF_INT64)) {
956template <
class STREAMBUF>
964template <
class STREAMBUF>
976#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
977 const char *rawBytes =
reinterpret_cast<char *
>(&value);
978 char bytes[k_SIZEOF_INT56];
980 bytes[0] = rawBytes[6];
981 bytes[1] = rawBytes[5];
982 bytes[2] = rawBytes[4];
983 bytes[3] = rawBytes[3];
984 bytes[4] = rawBytes[2];
985 bytes[5] = rawBytes[1];
986 bytes[6] = rawBytes[0];
989 reinterpret_cast<char *
>(&value) +
sizeof value - k_SIZEOF_INT56;
992 if (k_SIZEOF_INT56 == d_streamBuf->sputn(bytes, k_SIZEOF_INT56)) {
999template <
class STREAMBUF>
1007template <
class STREAMBUF>
1019#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1020 const char *rawBytes =
reinterpret_cast<char *
>(&value);
1021 char bytes[k_SIZEOF_INT48];
1023 bytes[0] = rawBytes[5];
1024 bytes[1] = rawBytes[4];
1025 bytes[2] = rawBytes[3];
1026 bytes[3] = rawBytes[2];
1027 bytes[4] = rawBytes[1];
1028 bytes[5] = rawBytes[0];
1031 reinterpret_cast<char *
>(&value) +
sizeof value - k_SIZEOF_INT48;
1034 if (k_SIZEOF_INT48 == d_streamBuf->sputn(bytes, k_SIZEOF_INT48)) {
1041template <
class STREAMBUF>
1049template <
class STREAMBUF>
1061#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1062 const char *rawBytes =
reinterpret_cast<char *
>(&value);
1063 char bytes[k_SIZEOF_INT40];
1065 bytes[0] = rawBytes[4];
1066 bytes[1] = rawBytes[3];
1067 bytes[2] = rawBytes[2];
1068 bytes[3] = rawBytes[1];
1069 bytes[4] = rawBytes[0];
1072 reinterpret_cast<char *
>(&value) +
sizeof value - k_SIZEOF_INT40;
1075 if (k_SIZEOF_INT40 == d_streamBuf->sputn(bytes, k_SIZEOF_INT40)) {
1082template <
class STREAMBUF>
1090template <
class STREAMBUF>
1102#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1103 const char *rawBytes =
reinterpret_cast<char *
>(&value);
1104 char bytes[k_SIZEOF_INT32];
1106 bytes[0] = rawBytes[3];
1107 bytes[1] = rawBytes[2];
1108 bytes[2] = rawBytes[1];
1109 bytes[3] = rawBytes[0];
1112 reinterpret_cast<char *
>(&value) +
sizeof value - k_SIZEOF_INT32;
1115 if (k_SIZEOF_INT32 == d_streamBuf->sputn(bytes, k_SIZEOF_INT32)) {
1122template <
class STREAMBUF>
1127 return putInt32(
static_cast<int>(value));
1130template <
class STREAMBUF>
1142#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1143 const char *rawBytes =
reinterpret_cast<char *
>(&value);
1144 char bytes[k_SIZEOF_INT24];
1146 bytes[0] = rawBytes[2];
1147 bytes[1] = rawBytes[1];
1148 bytes[2] = rawBytes[0];
1151 reinterpret_cast<char *
>(&value) +
sizeof value - k_SIZEOF_INT24;
1154 if (k_SIZEOF_INT24 == d_streamBuf->sputn(bytes, k_SIZEOF_INT24)) {
1161template <
class STREAMBUF>
1166 return putInt24(
static_cast<int>(value));
1169template <
class STREAMBUF>
1181#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1182 const char *rawBytes =
reinterpret_cast<char *
>(&value);
1183 char bytes[k_SIZEOF_INT16];
1185 bytes[0] = rawBytes[1];
1186 bytes[1] = rawBytes[0];
1189 reinterpret_cast<char *
>(&value) +
sizeof value - k_SIZEOF_INT16;
1192 if (k_SIZEOF_INT16 == d_streamBuf->sputn(bytes, k_SIZEOF_INT16)) {
1199template <
class STREAMBUF>
1204 return putInt16(
static_cast<int>(value));
1207template <
class STREAMBUF>
1219 if (STREAMBUF::traits_type::eof() !=
1220 d_streamBuf->sputc(
static_cast<char>(value))) {
1227template <
class STREAMBUF>
1232 return putInt8(
static_cast<int>(value));
1237template <
class STREAMBUF>
1249#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1250 const char *rawBytes =
reinterpret_cast<char *
>(&value);
1251 char bytes[k_SIZEOF_FLOAT64];
1253 bytes[0] = rawBytes[
sizeof value - 1];
1254 bytes[1] = rawBytes[
sizeof value - 2];
1255 bytes[2] = rawBytes[
sizeof value - 3];
1256 bytes[3] = rawBytes[
sizeof value - 4];
1257 bytes[4] = rawBytes[
sizeof value - 5];
1258 bytes[5] = rawBytes[
sizeof value - 6];
1259 bytes[6] = rawBytes[
sizeof value - 7];
1260 bytes[7] = rawBytes[
sizeof value - 8];
1262 const char *bytes =
reinterpret_cast<char *
>(&value);
1265 if (k_SIZEOF_FLOAT64 == d_streamBuf->sputn(bytes, k_SIZEOF_FLOAT64)) {
1272template <
class STREAMBUF>
1284#if BSLS_PLATFORM_IS_LITTLE_ENDIAN
1285 const char *rawBytes =
reinterpret_cast<char *
>(&value);
1286 char bytes[k_SIZEOF_FLOAT32];
1288 bytes[0] = rawBytes[
sizeof value - 1];
1289 bytes[1] = rawBytes[
sizeof value - 2];
1290 bytes[2] = rawBytes[
sizeof value - 3];
1291 bytes[3] = rawBytes[
sizeof value - 4];
1293 const char *bytes =
reinterpret_cast<char *
>(&value);
1296 if (k_SIZEOF_FLOAT32 == d_streamBuf->sputn(bytes, k_SIZEOF_FLOAT32)) {
1305template <
class STREAMBUF>
1310 putLength(
static_cast<int>(value.
length()));
1311 return putArrayUint8(value.
data(),
static_cast<int>(value.
length()));
1316template <
class STREAMBUF>
1330 for (; values != end; ++values) {
1337template <
class STREAMBUF>
1352 for (; values != end; ++values) {
1359template <
class STREAMBUF>
1373 for (; values != end; ++values) {
1380template <
class STREAMBUF>
1395 for (; values != end; ++values) {
1402template <
class STREAMBUF>
1416 for (; values != end; ++values) {
1423template <
class STREAMBUF>
1438 for (; values != end; ++values) {
1445template <
class STREAMBUF>
1459 for (; values != end; ++values) {
1466template <
class STREAMBUF>
1481 for (; values != end; ++values) {
1488template <
class STREAMBUF>
1500 const int *end = values + numValues;
1501 for (; values != end; ++values) {
1508template <
class STREAMBUF>
1521 const unsigned int *end = values + numValues;
1522 for (; values != end; ++values) {
1529template <
class STREAMBUF>
1541 const int *end = values + numValues;
1542 for (; values != end; ++values) {
1549template <
class STREAMBUF>
1562 const unsigned int *end = values + numValues;
1563 for (; values != end; ++values) {
1570template <
class STREAMBUF>
1582 const short *end = values + numValues;
1583 for (; values != end; ++values) {
1590template <
class STREAMBUF>
1603 const unsigned short *end = values + numValues;
1604 for (; values != end; ++values) {
1611template <
class STREAMBUF>
1626 if (numValues == d_streamBuf->sputn(values, numValues)) {
1633template <
class STREAMBUF>
1649 if (numValues == d_streamBuf->sputn(
reinterpret_cast<const char *
>(values),
1657template <
class STREAMBUF>
1672 if (numValues == d_streamBuf->sputn(values, numValues)) {
1679template <
class STREAMBUF>
1695 if (numValues == d_streamBuf->sputn(
reinterpret_cast<const char *
>(values),
1705template <
class STREAMBUF>
1718 const double *end = values + numValues;
1719 for (; values != end; ++values) {
1720 putFloat64(*values);
1726template <
class STREAMBUF>
1739 const float *end = values + numValues;
1740 for (; values != end; ++values) {
1741 putFloat32(*values);
1748template <
class STREAMBUF>
1752 return isValid() ? this : 0;
1755template <
class STREAMBUF>
1759 return d_versionSelector;
1762template <
class STREAMBUF>
1770template <
class STREAMBUF,
class TYPE>
Definition bslstl_string.h:1252
size_type length() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_string.h:7301
CHAR_TYPE * data() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_string.h:7177
Definition bslx_genericoutstream.h:363
GenericOutStream & putFloat32(float value)
Definition bslx_genericoutstream.h:1275
GenericOutStream & putInt32(int value)
Definition bslx_genericoutstream.h:1093
GenericOutStream & putInt56(bsls::Types::Int64 value)
Definition bslx_genericoutstream.h:967
GenericOutStream & putLength(int length)
Definition bslx_genericoutstream.h:897
GenericOutStream & putUint56(bsls::Types::Uint64 value)
Definition bslx_genericoutstream.h:1002
GenericOutStream & putArrayInt64(const bsls::Types::Int64 *values, int numValues)
Definition bslx_genericoutstream.h:1318
GenericOutStream & putArrayInt16(const short *values, int numValues)
Definition bslx_genericoutstream.h:1572
GenericOutStream & putUint40(bsls::Types::Uint64 value)
Definition bslx_genericoutstream.h:1085
int bdexVersionSelector() const
Definition bslx_genericoutstream.h:1757
GenericOutStream & putArrayUint48(const bsls::Types::Uint64 *values, int numValues)
Definition bslx_genericoutstream.h:1425
GenericOutStream & putArrayUint32(const unsigned int *values, int numValues)
Definition bslx_genericoutstream.h:1510
GenericOutStream & putUint64(bsls::Types::Uint64 value)
Definition bslx_genericoutstream.h:959
GenericOutStream & putArrayUint40(const bsls::Types::Uint64 *values, int numValues)
Definition bslx_genericoutstream.h:1468
GenericOutStream & putInt64(bsls::Types::Int64 value)
Definition bslx_genericoutstream.h:923
GenericOutStream & putArrayInt48(const bsls::Types::Int64 *values, int numValues)
Definition bslx_genericoutstream.h:1404
GenericOutStream & putVersion(int version)
Definition bslx_genericoutstream.h:913
GenericOutStream & putUint16(unsigned int value)
Definition bslx_genericoutstream.h:1202
GenericOutStream & putArrayInt24(const int *values, int numValues)
Definition bslx_genericoutstream.h:1531
GenericOutStream & putInt16(int value)
Definition bslx_genericoutstream.h:1172
GenericOutStream & putArrayUint56(const bsls::Types::Uint64 *values, int numValues)
Definition bslx_genericoutstream.h:1382
GenericOutStream & putString(const bsl::string &value)
Definition bslx_genericoutstream.h:1308
GenericOutStream & putInt24(int value)
Definition bslx_genericoutstream.h:1133
GenericOutStream & putInt8(int value)
Definition bslx_genericoutstream.h:1210
GenericOutStream & putInt40(bsls::Types::Int64 value)
Definition bslx_genericoutstream.h:1052
GenericOutStream & putUint24(unsigned int value)
Definition bslx_genericoutstream.h:1164
GenericOutStream & putArrayInt32(const int *values, int numValues)
Definition bslx_genericoutstream.h:1490
bool isValid() const
Definition bslx_genericoutstream.h:1764
GenericOutStream & putArrayFloat64(const double *values, int numValues)
Definition bslx_genericoutstream.h:1707
GenericOutStream & putInt48(bsls::Types::Int64 value)
Definition bslx_genericoutstream.h:1010
GenericOutStream & putArrayUint16(const unsigned short *values, int numValues)
Definition bslx_genericoutstream.h:1592
void invalidate()
Definition bslx_genericoutstream.h:889
GenericOutStream & putArrayUint64(const bsls::Types::Uint64 *values, int numValues)
Definition bslx_genericoutstream.h:1339
GenericOutStream & putArrayUint24(const unsigned int *values, int numValues)
Definition bslx_genericoutstream.h:1551
GenericOutStream & putFloat64(double value)
Definition bslx_genericoutstream.h:1240
~GenericOutStream()
Destroy this object.
Definition bslx_genericoutstream.h:869
GenericOutStream & flush()
Definition bslx_genericoutstream.h:876
GenericOutStream & putUint48(bsls::Types::Uint64 value)
Definition bslx_genericoutstream.h:1044
GenericOutStream & putArrayFloat32(const float *values, int numValues)
Definition bslx_genericoutstream.h:1728
GenericOutStream & putArrayInt8(const char *values, int numValues)
Definition bslx_genericoutstream.h:1614
GenericOutStream & putUint32(unsigned int value)
Definition bslx_genericoutstream.h:1125
GenericOutStream & putUint8(unsigned int value)
Definition bslx_genericoutstream.h:1230
GenericOutStream & putArrayInt56(const bsls::Types::Int64 *values, int numValues)
Definition bslx_genericoutstream.h:1361
GenericOutStream & putArrayInt40(const bsls::Types::Int64 *values, int numValues)
Definition bslx_genericoutstream.h:1447
GenericOutStream & putArrayUint8(const char *values, int numValues)
Definition bslx_genericoutstream.h:1660
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
STREAM & bdexStreamOut(STREAM &stream, const TYPE &value)
Definition bslx_outstreamfunctions.h:1004
Definition bslx_byteinstream.h:377
bsl::ostream & operator<<(bsl::ostream &stream, const ByteInStream &object)
unsigned long long Uint64
Definition bsls_types.h:139
long long Int64
Definition bsls_types.h:134