8#ifndef INCLUDED_BALBER_BERENCODER
9#define INCLUDED_BALBER_BERENCODER
203#include <balscm_version.h>
231#include <bsl_ostream.h>
232#include <bsl_string.h>
233#include <bsl_vector.h>
234#include <bsl_typeinfo.h>
240struct BerEncoder_encodeProxy;
241class BerEncoder_Visitor;
242class BerEncoder_UniversalElementVisitor;
243class BerEncoder_LevelGuard;
244class BerEncoder_UseArrayLengthHintGuard;
271 class MemOutStream :
public bsl::ostream {
278 MemOutStream(
const MemOutStream&);
279 MemOutStream& operator=(
const MemOutStream&);
306 const
char *
data() const;
319#ifndef BDE_OMIT_INTERNAL_DEPRECATED
335 MemOutStream *d_logStream;
339 bsl::streambuf *d_streamBuf;
342 bool d_useArrayLengthHint;
358 const char *name = 0,
364 const char *name = 0,
369 bsl::ostream& logStream();
377 template <
typename TYPE>
378 int encodeArrayImpl(
const TYPE& value,
383 template <
typename TYPE>
384 int encodeImpl(
const TYPE& value,
390 template <
typename TYPE>
391 int encodeImpl(
const TYPE& value,
397 template <
typename TYPE>
398 int encodeImpl(
const TYPE& value,
404 template <
typename TYPE>
405 int encodeImpl(
const TYPE& value,
411 template <
typename TYPE>
412 int encodeImpl(
const TYPE& value,
418 template <
typename TYPE>
419 int encodeImpl(
const TYPE& value,
425 template <
typename TYPE>
426 int encodeImpl(
const TYPE& value,
432 template <
typename TYPE>
433 int encodeImpl(
const TYPE& value,
456 template <
typename TYPE>
457 int encode(bsl::streambuf *streamBuf,
const TYPE& value);
462 template <
typename TYPE>
463 int encode(bsl::ostream& stream,
const TYPE& value);
472 template <
typename TYPE>
473 int encodeAny(bsl::streambuf *streamBuf,
const TYPE& value);
483 template <
typename TYPE>
484 int encodeAny(bsl::ostream& stream,
const TYPE& value);
579 template <
typename TYPE,
typename INFO>
580 int operator()(
const TYPE& value,
const INFO& info);
597 int d_formattingMode;
616 template <
typename TYPE>
617 int operator()(
const TYPE& value);
644 template <
typename TYPE>
645 int operator()(
const TYPE&
object,
bslmf::Nil);
647 template <
typename TYPE,
typename ANY_CATEGORY>
648 int operator()(
const TYPE&
object, ANY_CATEGORY category);
650 template <
typename TYPE>
651 int operator()(
const TYPE&
object);
665balber::BerEncoder::MemOutStream::MemOutStream(
668, d_sb(
bslma::Default::allocator(basicAllocator))
690 return static_cast<int>(d_sb.length());
700BerEncoder_LevelGuard::BerEncoder_LevelGuard(
BerEncoder *encoder)
703 ++d_encoder->d_currentDepth;
709 --d_encoder->d_currentDepth;
717BerEncoder_UseArrayLengthHintGuard::BerEncoder_UseArrayLengthHintGuard(
720, d_previous (encoder->d_useArrayLengthHint)
722 d_encoder->d_useArrayLengthHint = value;
728 d_encoder->d_useArrayLengthHint = d_previous;
735template <
typename TYPE>
743template <
typename TYPE,
typename ANY_CATEGORY>
746 ANY_CATEGORY category)
755template <
typename TYPE>
762 return this->
operator()(
object, TypeCategory());
793bsl::ostream& BerEncoder::logStream()
795 if (d_logStream == 0) {
796 d_logStream =
new(d_logArea.
buffer()) MemOutStream(d_allocator);
801template <
typename TYPE>
806 d_streamBuf = streamBuf;
809 if (d_logStream != 0) {
810 d_logStream->reset();
836 streamBuf->pubsync();
841template <
typename TYPE>
844 if (!stream.good()) {
848 if (0 != this->
encode(stream.rdbuf(), value)) {
849 stream.setstate(bsl::ios_base::failbit);
855template <
typename TYPE>
862template <
typename TYPE>
870template <
typename TYPE>
871int BerEncoder::encodeImpl(
const TYPE& value,
877 enum { k_SUCCESS = 0, k_FAILURE = -1 };
891 const bool isUntagged = formattingMode
921 this->logError(tagClass,
942template <
typename TYPE>
943int BerEncoder::encodeImpl(
const TYPE& value,
949 enum { k_SUCCESS = 0, k_FAILURE = -1 };
999template <
typename TYPE>
1000int BerEncoder::encodeImpl(
const TYPE& value,
1012 int rc = encodeImpl(
1017 BaseTypeCategory());
1022template <
typename TYPE>
1023int BerEncoder::encodeImpl(
const TYPE& value,
1042template <
typename TYPE>
1043int BerEncoder::encodeImpl(
const TYPE& value,
1068template <
typename TYPE>
1069int BerEncoder::encodeImpl(
const TYPE& value,
1084template <
typename TYPE>
1086int BerEncoder::encodeImpl(
const TYPE& value,
1092 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1098 return this->encodeArrayImpl(value,
1104template <
typename TYPE>
1106BerEncoder::encodeArrayImpl(
const TYPE& value,
1111 enum { k_FAILURE = -1, k_SUCCESS = 0 };
1121 if ( d_useArrayLengthHint
1145 for (
int i = 0; i <
size; ++i) {
1148 this->logError(tagClass,
1160template <
typename TYPE>
1162int BerEncoder::encodeImpl(
const TYPE& value,
1185, d_levelGuard(encoder)
1195template <
typename TYPE,
typename INFO>
1202 int rc = d_encoder->encodeImpl(value,
1205 info.formattingMode(),
1223BerEncoder_UniversalElementVisitor::
1224BerEncoder_UniversalElementVisitor(
BerEncoder *encoder,
1227, d_formattingMode(formattingMode)
1228, d_levelGuard(encoder)
1239template <
typename TYPE>
1242 enum { k_SUCCESS = 0, k_FAILURE = -1 };
1252 if (d_encoder->encodeImpl(value,
1254 static_cast<int>(tagNumber),
Definition balber_berencoderoptions.h:70
bool disableUnselectedChoiceEncoding() const
Definition balber_berencoderoptions.h:806
bool encodeEmptyArrays() const
Definition balber_berencoderoptions.h:788
bool encodeArrayLengthHints() const
Definition balber_berencoderoptions.h:818
Definition balber_berencoder.h:511
~BerEncoder_LevelGuard()
Definition balber_berencoder.h:707
Definition balber_berencoder.h:593
~BerEncoder_UniversalElementVisitor()
Definition balber_berencoder.h:1234
int operator()(const TYPE &value)
Definition balber_berencoder.h:1240
Definition balber_berencoder.h:535
~BerEncoder_UseArrayLengthHintGuard()
Definition balber_berencoder.h:726
Definition balber_berencoder.h:562
~BerEncoder_Visitor()
Definition balber_berencoder.h:1190
int operator()(const TYPE &value, const INFO &info)
Definition balber_berencoder.h:1197
Definition balber_berencoder.h:254
friend class BerEncoder_UseArrayLengthHintGuard
Definition balber_berencoder.h:262
int encode(bsl::streambuf *streamBuf, const TYPE &value)
Definition balber_berencoder.h:802
friend struct BerEncoder_encodeProxy
Definition balber_berencoder.h:258
int encodeAny(bsl::streambuf *streamBuf, const TYPE &value)
Definition balber_berencoder.h:857
ErrorSeverity errorSeverity() const
Definition balber_berencoder.h:777
ErrorSeverity
Definition balber_berencoder.h:315
@ e_BER_ERROR
Definition balber_berencoder.h:317
@ e_BER_SUCCESS
Definition balber_berencoder.h:316
@ BDEM_BER_SUCCESS
Definition balber_berencoder.h:320
@ BDEM_BER_ERROR
Definition balber_berencoder.h:321
friend class BerEncoder_Visitor
Definition balber_berencoder.h:259
int encodeAny(bsl::ostream &stream, const bdlar::AnyConstRef &any)
const BerEncoderOptions * options() const
Return address of the options.
Definition balber_berencoder.h:771
friend class BerEncoder_LevelGuard
Definition balber_berencoder.h:261
friend class BerEncoder_UniversalElementVisitor
Definition balber_berencoder.h:260
int encodeAny(bsl::streambuf *streamBuf, const bdlar::AnyConstRef &any)
bslstl::StringRef loggedMessages() const
Definition balber_berencoder.h:783
BerEncoder(const BerEncoderOptions *options=0, bslma::Allocator *basicAllocator=0)
Definition bdlar_anyref.h:247
static bsl::enable_if<!IsDynamic< t_TYPE >::value, AnyConstRef >::type makeAnyConstRef(const t_TYPE &object)
Make AnyConstRef to the specified object.
Definition bdlar_refutil.h:194
Definition bdlsb_memoutstreambuf.h:212
Definition bslstl_vector.h:1120
Definition bslma_allocator.h:545
Definition bslstl_stringref.h:374
const char * data() const
Definition balber_berencoder.h:682
void reset()
Reset the internal streambuf to empty.
Definition balber_berencoder.h:675
int length() const
Definition balber_berencoder.h:688
static int accessByCategory(const TYPE &object, ACCESSOR &accessor)
Definition bdlat_typecategory.h:1455
#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
#define BSLS_KEYWORD_OVERRIDE
Definition bsls_keyword.h:695
Definition balber_berconstants.h:84
bsl::size_t size(const TYPE &array)
Return the number of elements in the specified array.
int accessElement(const TYPE &array, ACCESSOR &accessor, int index)
int accessSelection(const TYPE &object, ACCESSOR &accessor)
@ k_UNDEFINED_SELECTION_ID
Definition bdlat_choicefunctions.h:515
int selectionId(const TYPE &object)
const BaseType< TYPE >::Type & convertToBaseType(const TYPE &object)
Load into the specified result the value of the specified object.
void toInt(int *result, const TYPE &value)
bool isNull(const TYPE &object)
int accessValue(const TYPE &object, ACCESSOR &accessor)
int accessAttributes(const TYPE &object, ACCESSOR &accessor)
Definition bdlat_valuetypefunctions.h:939
Definition baljsn_encoder_testtypes.h:76
StringRefImp< char > StringRef
Definition bslstl_stringref.h:725
TagType
Definition balber_berconstants.h:117
@ e_PRIMITIVE
Definition balber_berconstants.h:120
@ e_CONSTRUCTED
Definition balber_berconstants.h:121
TagClass
Definition balber_berconstants.h:96
@ e_CONTEXT_SPECIFIC
Definition balber_berconstants.h:101
@ e_UNIVERSAL
Definition balber_berconstants.h:99
static const int k_ARRAY_LENGTH_HINT_TAG_NUMBER
Definition balber_berconstants.h:132
Definition balber_berencoder.h:632
BerEncoder * d_encoder
Definition balber_berencoder.h:635
BerConstants::TagClass d_tagClass
Definition balber_berencoder.h:636
int operator()(const TYPE &object, bslmf::Nil)
Definition balber_berencoder.h:737
int d_formattingMode
Definition balber_berencoder.h:638
int d_tagNumber
Definition balber_berencoder.h:637
Value
Definition balber_beruniversaltagnumber.h:196
static Value select(const TYPE &object, int formattingMode, int *alternateTag)
Definition balber_beruniversaltagnumber.h:605
static int putEndOfContentOctets(bsl::streambuf *streamBuf)
Definition balber_berutil.h:4022
static int putIndefiniteLengthOctet(bsl::streambuf *streamBuf)
Definition balber_berutil.h:4028
static int putValue(bsl::streambuf *streamBuf, const TYPE &value, const BerEncoderOptions *options=0)
Definition balber_berutil.h:4041
static int putIdentifierOctets(bsl::streambuf *streamBuf, BerConstants::TagClass tagClass, BerConstants::TagType tagType, int tagNumber)
TYPE::BaseType Type
Definition bdlat_customizedtypefunctions.h:535
Definition bdlat_typecategory.h:1037
Definition bdlat_typecategory.h:1038
Definition bdlat_typecategory.h:1039
Definition bdlat_typecategory.h:1036
Definition bdlat_typecategory.h:1040
Definition bdlat_typecategory.h:1041
Definition bdlat_typecategory.h:1042
Definition bdlat_typecategory.h:1043
Definition bslmf_nil.h:133
Definition bsls_objectbuffer.h:277
char * buffer()
Definition bsls_objectbuffer.h:345