8#ifndef INCLUDED_BDLAT_SYMBOLICCONVERTER
9#define INCLUDED_BDLAT_SYMBOLICCONVERTER
262#include <bdlscm_version.h>
281#include <bsl_ostream.h>
282#include <bsl_string.h>
301 template <
class LHS_TYPE,
class RHS_TYPE>
303 int convert(LHS_TYPE *lhs,
const RHS_TYPE &rhs);
304 template <
class LHS_TYPE,
class RHS_TYPE>
306 int convert(LHS_TYPE *lhs,
const RHS_TYPE &rhs, bsl::ostream &errorStream);
320 template <
class RHS_TYPE>
321 struct CustomizedManipulator;
324 bsl::ostream *d_errorStream_p;
330 template <
class LHS_TYPE,
class RHS_TYPE>
337 template <
class LHS_TYPE,
class RHS_TYPE>
344 template <
class LHS_TYPE,
class RHS_TYPE>
351 template <
class LHS_TYPE,
class RHS_TYPE>
358 template <
class LHS_TYPE,
class RHS_TYPE>
365 template <
class LHS_TYPE,
class RHS_TYPE>
372 template <
class LHS_TYPE,
class RHS_TYPE>
379 template <
class LHS_TYPE,
class RHS_TYPE,
class RHS_CATEGORY>
383 RHS_CATEGORY rhsCategory);
386 template <
class LHS_TYPE,
class LHS_CATEGORY,
class RHS_TYPE>
388 LHS_CATEGORY lhsCategory,
396 template <
class LHS_TYPE,
class RHS_TYPE>
403 template <
class LHS_TYPE,
class RHS_TYPE>
410 template <
class LHS_TYPE,
class RHS_TYPE,
class RHS_CATEGORY>
414 RHS_CATEGORY rhsCategory);
417 template <
class LHS_TYPE,
class LHS_CATEGORY,
class RHS_TYPE>
419 LHS_CATEGORY lhsCategory,
427 template <
class LHS_TYPE,
class RHS_TYPE>
436 template <
class LHS_TYPE,
class RHS_TYPE>
444 template <
class LHS_TYPE,
449 LHS_CATEGORY lhsCategory,
451 RHS_CATEGORY rhsCategory);
454 template <
class LHS_TYPE,
class RHS_TYPE>
459 template <
class LHS_TYPE,
465 RHS_CATEGORY rhsCategory);
466 template <
class LHS_TYPE,
470 LHS_CATEGORY lhsCategory,
473 template <
class LHS_TYPE,
478 LHS_CATEGORY lhsCategory,
480 RHS_CATEGORY rhsCategory);
499 template <
class LHS_TYPE,
class RHS_TYPE>
501 const RHS_TYPE& rhs);
515template <
class LVALUE_TYPE>
519 LVALUE_TYPE *d_destination_p;
525 LVALUE_TYPE *destination,
531 template <
class RVALUE_TYPE,
class INFO_TYPE>
533 const INFO_TYPE&)
const;
536 template <
class RVALUE_TYPE>
537 int operator()(
const RVALUE_TYPE&
object)
const;
547template <
class RVALUE_TYPE>
552 const RVALUE_TYPE& d_value;
557 const RVALUE_TYPE& value,
563 template <
class LVALUE_TYPE,
class INFO_TYPE>
565 const INFO_TYPE&)
const;
568 template <
class LVALUE_TYPE>
584template <
class SEQUENCE_TYPE>
588 SEQUENCE_TYPE *d_destination_p;
594 SEQUENCE_TYPE *destination,
598 template <
class SOURCE_MEMBER_TYPE,
class INFO_TYPE>
599 int operator()(
const SOURCE_MEMBER_TYPE& sourceMember,
600 const INFO_TYPE& info)
const;
610template <
class CHOICE_TYPE>
614 CHOICE_TYPE *d_destination_p;
620 CHOICE_TYPE *destination,
624 template <
class SOURCE_MEMBER_TYPE,
class INFO_TYPE>
625 int operator()(
const SOURCE_MEMBER_TYPE& sourceMember,
626 const INFO_TYPE& info)
const;
637template <
class ARRAY_TYPE>
641 ARRAY_TYPE *d_array_p;
653 template <
class SOURCE_ELEMENT_TYPE>
654 int operator()(
const SOURCE_ELEMENT_TYPE& sourceElement)
const;
664template <
class NULLABLE_TYPE>
668 NULLABLE_TYPE *d_destination_p;
674 NULLABLE_TYPE *destination,
678 template <
class VALUE_TYPE>
679 int operator()(
const VALUE_TYPE& value)
const;
693template <
class LHS_TYPE,
class LHS_CATEGORY>
706 template <
class TYPE>
714 template <
class TYPE,
class ANY_CATEGORY>
732template <
class RHS_TYPE,
class RHS_CATEGORY>
745 template <
class TYPE>
753 template <
class TYPE,
class ANY_CATEGORY>
774template <
class LHS_TYPE,
class RHS_TYPE>
786template <
class LHS_TYPE,
class RHS_TYPE>
792 enum { k_SUCCESS = 0 };
806template <
class LHS_TYPE,
class RHS_TYPE>
812 enum { k_SUCCESS = 0, k_FAILURE = -4 };
818 for (
int i = 0; i < size; ++i) {
820 storeInLhs(lhs, i,
this);
830template <
class LHS_TYPE,
class RHS_TYPE>
843 static_cast<int>(str.
length()));
846template <
class LHS_TYPE,
class RHS_TYPE>
856template <
class LHS_TYPE,
class RHS_TYPE>
866template <
class LHS_TYPE,
class RHS_TYPE>
873 enum { k_SUCCESS = 0 };
886template <
class LHS_TYPE,
class RHS_TYPE,
class RHS_CATEGORY>
896 return storeInLhs(rhs);
899template <
class LHS_TYPE,
class LHS_CATEGORY,
class RHS_TYPE>
906 enum { k_SUCCESS = 0 };
918template <
class LHS_TYPE,
class RHS_TYPE>
925 enum { k_SUCCESS = 0 };
937template <
class LHS_TYPE,
class RHS_TYPE>
949template <
class RHS_TYPE>
950struct bdlat_SymbolicConverter_Imp::CustomizedManipulator {
953 const RHS_TYPE& d_rhs;
956 template <
class LHS_BASE_TYPE>
957 int operator()(LHS_BASE_TYPE *lhsBaseValue) {
958 enum { k_FAILURE = -5 };
959 if (0 != d_that->
convert(lhsBaseValue, d_rhs)) {
966template <
class LHS_TYPE,
class RHS_TYPE,
class RHS_CATEGORY>
973 CustomizedManipulator<RHS_TYPE> baseManipulator = {
this, rhs};
979template <
class LHS_TYPE,
class LHS_CATEGORY,
class RHS_TYPE>
991template <
class LHS_TYPE,
class RHS_TYPE>
1003template <
class LHS_TYPE,
class RHS_TYPE>
1007 const RHS_TYPE& rhs,
1013template <
class LHS_TYPE,
1023 enum { k_FAILURE = -6 };
1028template <
class LHS_TYPE,
class RHS_TYPE>
1033 const RHS_TYPE& rhs,
1043template <
class LHS_TYPE,
class RHS_TYPE,
class RHS_CATEGORY>
1048 const RHS_TYPE& rhs,
1053 RHS_CATEGORY> proxy = {
this, &rhs };
1058template <
class LHS_TYPE,
class LHS_CATEGORY,
class RHS_TYPE>
1063 const RHS_TYPE& rhs,
1068 LHS_CATEGORY> proxy = {
this, lhs };
1073template <
class LHS_TYPE,
1080 LHS_CATEGORY lhsCategory,
1081 const RHS_TYPE& rhs,
1082 RHS_CATEGORY rhsCategory)
1084 return convert(lhs, lhsCategory, rhs, rhsCategory);
1090bdlat_SymbolicConverter_Imp::bdlat_SymbolicConverter_Imp(
1091 bsl::ostream *errorStream)
1092: d_errorStream_p(errorStream)
1099template <
class LHS_TYPE,
class RHS_TYPE>
1102 const RHS_TYPE& rhs)
1113 return *d_errorStream_p;
1122template <
class LVALUE_TYPE>
1127: d_destination_p(destination)
1134template <
class LVALUE_TYPE>
1135template <
class RVALUE_TYPE,
class INFO_TYPE>
1138 const RVALUE_TYPE&
object,
1139 const INFO_TYPE&)
const
1141 return d_imp_p->convert(d_destination_p,
object);
1144template <
class LVALUE_TYPE>
1145template <
class RVALUE_TYPE>
1148 const RVALUE_TYPE&
object)
const
1150 return d_imp_p->convert(d_destination_p,
object);
1159template <
class RVALUE_TYPE>
1163 const RVALUE_TYPE& value,
1172template <
class RVALUE_TYPE>
1173template <
class LVALUE_TYPE,
class INFO_TYPE>
1176 LVALUE_TYPE *
object,
1177 const INFO_TYPE&)
const
1179 return d_imp_p->convert(
object, d_value);
1182template <
class RVALUE_TYPE>
1183template <
class LVALUE_TYPE>
1186 LVALUE_TYPE *
object)
const
1188 return d_imp_p->convert(
object, d_value);
1197template <
class SEQUENCE_TYPE>
1201 SEQUENCE_TYPE *destination,
1203: d_destination_p(destination)
1210template <
class SEQUENCE_TYPE>
1211template <
class SOURCE_MEMBER_TYPE,
class INFO_TYPE>
1214 const SOURCE_MEMBER_TYPE& sourceMember,
1215 const INFO_TYPE& info)
const
1217 enum { k_SUCCESS = 0, k_FAILURE = -7 };
1226 info.nameLength())) {
1227 d_imp_p->errorStream()
1228 <<
"Failed to convert attribute '"
1243template <
class CHOICE_TYPE>
1248: d_destination_p(destination)
1255template <
class CHOICE_TYPE>
1256template <
class SOURCE_MEMBER_TYPE,
class INFO_TYPE>
1258 const SOURCE_MEMBER_TYPE& sourceMember,
1259 const INFO_TYPE& info)
const
1261 enum { k_SUCCESS = 0, k_FAILURE = -8 };
1267 info.nameLength())) {
1268 d_imp_p->errorStream()
1269 <<
"Failed to make selection '"
1283 d_imp_p->errorStream()
1284 <<
"Failed to convert selection '"
1299template <
class ARRAY_TYPE>
1313template <
class ARRAY_TYPE>
1314template <
class SOURCE_ELEMENT_TYPE>
1317 const SOURCE_ELEMENT_TYPE& sourceElement)
const
1334template <
class NULLABLE_TYPE>
1338 NULLABLE_TYPE *destination,
1340: d_destination_p(destination)
1347template <
class NULLABLE_TYPE>
1348template <
class VALUE_TYPE>
1351 const VALUE_TYPE& value)
const
1368template <
class LHS_TYPE,
class RHS_TYPE>
1371 const RHS_TYPE& rhs)
1373 bsl::ostream nullStream(0);
1377template <
class LHS_TYPE,
class RHS_TYPE>
1380 const RHS_TYPE& rhs,
1381 bsl::ostream& errorStream)
Definition bdlat_symbolicconverter.h:318
~bdlat_SymbolicConverter_Imp()=default
Destroy this object.
Definition bdlat_symbolicconverter.h:548
Definition bdlat_symbolicconverter.h:638
Definition bdlat_symbolicconverter.h:611
Definition bdlat_symbolicconverter.h:665
Definition bdlat_symbolicconverter.h:585
Definition bdlat_symbolicconverter.h:516
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
bdlat_SymbolicConverter_LoadValue(const RVALUE_TYPE &value, bdlat_SymbolicConverter_Imp *imp)
Definition bdlat_symbolicconverter.h:1162
int operator()(const SOURCE_MEMBER_TYPE &sourceMember, const INFO_TYPE &info) const
Definition bdlat_symbolicconverter.h:1257
bsl::ostream & errorStream()
Return a reference to the error stream.
Definition bdlat_symbolicconverter.h:1111
bdlat_SymbolicConverter_StoreInSequence(SEQUENCE_TYPE *destination, bdlat_SymbolicConverter_Imp *imp)
Definition bdlat_symbolicconverter.h:1200
bdlat_SymbolicConverter_StoreInArrayElement(ARRAY_TYPE *array, int index, bdlat_SymbolicConverter_Imp *imp)
Definition bdlat_symbolicconverter.h:1302
int operator()(const SOURCE_ELEMENT_TYPE &sourceElement) const
Definition bdlat_symbolicconverter.h:1316
bdlat_SymbolicConverter_StoreValue(LVALUE_TYPE *destination, bdlat_SymbolicConverter_Imp *imp)
Definition bdlat_symbolicconverter.h:1125
bdlat_SymbolicConverter_StoreInNullable(NULLABLE_TYPE *destination, bdlat_SymbolicConverter_Imp *imp)
Definition bdlat_symbolicconverter.h:1337
int operator()(const VALUE_TYPE &value) const
Definition bdlat_symbolicconverter.h:1350
int operator()(const SOURCE_MEMBER_TYPE &sourceMember, const INFO_TYPE &info) const
Definition bdlat_symbolicconverter.h:1213
bdlat_SymbolicConverter_StoreInChoice(CHOICE_TYPE *destination, bdlat_SymbolicConverter_Imp *imp)
Definition bdlat_symbolicconverter.h:1246
int operator()(LVALUE_TYPE *object, const INFO_TYPE &) const
Assign d_value to the specified *object.
Definition bdlat_symbolicconverter.h:1175
int operator()(const RVALUE_TYPE &object, const INFO_TYPE &) const
Assign the specified object to *d_lValue_p.
Definition bdlat_symbolicconverter.h:1137
int convert(LHS_TYPE *lhs, bdlat_TypeCategory::Sequence lhsCategory, const RHS_TYPE &rhs, bdlat_TypeCategory::Sequence rhsCategory)
Convert to sequence from sequence.
Definition bdlat_symbolicconverter.h:776
static int convert(LHS_TYPE *lhs, const RHS_TYPE &rhs)
Definition bdlat_symbolicconverter.h:1370
int resolveDynamicTypes(LHS_TYPE *lhs, bdlat_TypeCategory::DynamicType lhsCategory, const RHS_TYPE &rhs, bdlat_TypeCategory::DynamicType rhsCategory)
Resolve dynamic types.
Definition bdlat_symbolicconverter.h:1030
static int manipulateByCategory(TYPE *object, MANIPULATOR &manipulator)
Definition bdlat_typecategory.h:1414
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
int manipulateElement(TYPE *array, MANIPULATOR &manipulator, int index)
void resize(TYPE *array, int newSize)
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 manipulateSelection(TYPE *object, MANIPULATOR &manipulator)
int makeSelection(TYPE *object, int selectionId)
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.
int createBaseAndConvert(t_TYPE *object, t_MANIPULATOR &baseManipulator)
int fromString(TYPE *result, const char *string, int stringLength)
void toString(bsl::string *result, const TYPE &value)
bool isNull(const TYPE &object)
int manipulateValue(TYPE *object, MANIPULATOR &manipulator)
int accessValue(const TYPE &object, ACCESSOR &accessor)
void makeValue(TYPE *object)
int accessAttributes(const TYPE &object, ACCESSOR &accessor)
int manipulateAttribute(TYPE *object, MANIPULATOR &manipulator, const char *attributeName, int attributeNameLength)
void reset(TYPE *object)
Reset the value of the specified object to its default value.
int assign(LHS_TYPE *lhs, const RHS_TYPE &rhs)
StringRefImp< char > StringRef
Definition bslstl_stringref.h:725
Definition bdlat_symbolicconverter.h:733
const RHS_TYPE * d_rhs_p
Definition bdlat_symbolicconverter.h:737
int operator()(TYPE *object, ANY_CATEGORY category)
Definition bdlat_symbolicconverter.h:755
bdlat_SymbolicConverter_Imp * d_instance_p
Definition bdlat_symbolicconverter.h:736
int operator()(TYPE *, bslmf::Nil)
Definition bdlat_symbolicconverter.h:747
Definition bdlat_symbolicconverter.h:694
bdlat_SymbolicConverter_Imp * d_instance_p
Definition bdlat_symbolicconverter.h:697
int operator()(const TYPE &object, ANY_CATEGORY category)
Definition bdlat_symbolicconverter.h:716
int operator()(const TYPE &, bslmf::Nil)
Definition bdlat_symbolicconverter.h:708
LHS_TYPE * d_lhs_p
Definition bdlat_symbolicconverter.h:698
Definition bdlat_symbolicconverter.h:294
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