OpenDDS  Snapshot(2023/01/19-09:53)
Classes | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
typeobject_generator Class Reference

#include <typeobject_generator.h>

Inheritance diagram for typeobject_generator:
Inheritance graph
[legend]
Collaboration diagram for typeobject_generator:
Collaboration graph
[legend]

Classes

struct  Element
 
struct  TypeIdentifierPair
 
struct  TypeObjectPair
 

Public Member Functions

 typeobject_generator ()
 
void gen_epilogue ()
 
bool gen_enum (AST_Enum *node, UTL_ScopedName *name, const std::vector< AST_EnumVal *> &contents, const char *repoid)
 
bool gen_struct (AST_Structure *node, UTL_ScopedName *name, const std::vector< AST_Field *> &fields, AST_Type::SIZE_TYPE size, const char *repoid)
 
bool gen_typedef (AST_Typedef *node, UTL_ScopedName *name, AST_Type *type, const char *repoid)
 
bool gen_union (AST_Union *node, UTL_ScopedName *name, const std::vector< AST_UnionBranch *> &branches, AST_Type *type, const char *repoid)
 
void produce_output (bool flag)
 
void produce_xtypes_complete (bool flag)
 
void use_old_typeobject_encoding ()
 
- Public Member Functions inherited from dds_generator
virtual ~dds_generator ()=0
 
virtual bool do_included_files () const
 
virtual void gen_prologue ()
 
virtual bool gen_const (UTL_ScopedName *, bool, AST_Constant *)
 
virtual bool gen_struct_fwd (UTL_ScopedName *, AST_Type::SIZE_TYPE)
 
virtual bool gen_interf (AST_Interface *, UTL_ScopedName *, bool, const std::vector< AST_Interface *> &, const std::vector< AST_Interface *> &, const std::vector< AST_Attribute *> &, const std::vector< AST_Operation *> &, const char *)
 
virtual bool gen_interf_fwd (UTL_ScopedName *)
 
virtual bool gen_native (AST_Native *, UTL_ScopedName *, const char *)
 
virtual bool gen_union_fwd (AST_UnionFwd *, UTL_ScopedName *, AST_Type::SIZE_TYPE)
 

Static Public Member Functions

static std::string tag_type (UTL_ScopedName *name)
 
- Static Public Member Functions inherited from dds_generator
static std::string get_tag_name (const std::string &base_name, bool nested_key_only=false)
 
static std::string get_xtag_name (UTL_ScopedName *name)
 
static bool cxx_escaped (const std::string &s)
 
static std::string valid_var_name (const std::string &str)
 
static std::string to_string (Identifier *id, EscapeContext ec=EscapeContext_Normal)
 
static std::string scoped_helper (UTL_ScopedName *sn, const char *sep, EscapeContext cxt=EscapeContext_Normal)
 
static std::string module_scope_helper (UTL_ScopedName *sn, const char *sep, EscapeContext cxt=EscapeContext_Normal)
 

Private Types

typedef std::map< AST_Type *, TypeObjectPairTypeObjectMap
 
typedef std::map< AST_Type *, TypeIdentifierPairHashTypeIdentifierMap
 
typedef std::map< AST_Type *, OpenDDS::XTypes::TypeIdentifierFullyDescriptiveTypeIdentifierMap
 
typedef std::vector< AST_Type * > Stack
 

Private Member Functions

void consider (Element &v, AST_Type *type, const std::string &anonymous_name)
 
void strong_connect (AST_Type *type, const std::string &anonymous_name)
 
void generate_type_identifier (AST_Type *type, bool force_type_object)
 
void generate_struct_type_identifier (AST_Type *type)
 
void generate_union_type_identifier (AST_Type *type)
 
void generate_enum_type_identifier (AST_Type *type)
 
void generate_array_type_identifier (AST_Type *type, bool force_type_object)
 
void generate_sequence_type_identifier (AST_Type *type, bool force_type_object)
 
void generate_alias_type_identifier (AST_Type *type)
 
void generate_primitive_type_identifier (AST_Type *type)
 
void update_maps (AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
 
void set_builtin_member_annotations (AST_Decl *member, OpenDDS::XTypes::Optional< OpenDDS::XTypes::AppliedBuiltinMemberAnnotations > &annotations)
 
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier (AST_Type *type)
 
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier (AST_Type *type)
 
bool generate (AST_Type *node, UTL_ScopedName *name)
 
void declare_get_type_map ()
 

Private Attributes

TypeObjectMap type_object_map_
 
HashTypeIdentifierMap hash_type_identifier_map_
 
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
 
OpenDDS::XTypes::TypeMap minimal_type_map_
 
OpenDDS::XTypes::TypeMap complete_type_map_
 
bool produce_output_
 
bool produce_xtypes_complete_
 
size_t index_
 
Stack stack_
 
std::map< AST_Type *, Elementelement_
 
bool get_type_map_declared_
 
OpenDDS::DCPS::Encodingtypeid_encoding_
 

Detailed Description

Definition at line 14 of file typeobject_generator.h.

Member Typedef Documentation

◆ FullyDescriptiveTypeIdentifierMap

Definition at line 109 of file typeobject_generator.h.

◆ HashTypeIdentifierMap

Definition at line 106 of file typeobject_generator.h.

◆ Stack

typedef std::vector<AST_Type*> typeobject_generator::Stack
private

Definition at line 118 of file typeobject_generator.h.

◆ TypeObjectMap

typedef std::map<AST_Type*, TypeObjectPair> typeobject_generator::TypeObjectMap
private

Definition at line 97 of file typeobject_generator.h.

Constructor & Destructor Documentation

◆ typeobject_generator()

typeobject_generator::typeobject_generator ( )
inline

Member Function Documentation

◆ consider()

void typeobject_generator::consider ( Element v,
AST_Type *  type,
const std::string &  anonymous_name 
)
private

Definition at line 726 of file typeobject_generator.cpp.

References typeobject_generator::Element::lowlink.

Referenced by typeobject_generator::Element::operator<().

727 {
728  switch (type->node_type()) {
729  case AST_ConcreteType::NT_union_fwd:
730  {
731  AST_UnionFwd* const n = dynamic_cast<AST_UnionFwd*>(type);
732  type = n->full_definition();
733  break;
734  }
735  case AST_ConcreteType::NT_struct_fwd:
736  {
737  AST_StructureFwd* const n = dynamic_cast<AST_StructureFwd*>(type);
738  type = n->full_definition();
739  break;
740  }
741  default:
742  break;
743  }
744 
745  if (element_.find(type) == element_.end()) {
746  strong_connect(type, anonymous_name);
747  v.lowlink = std::min(v.lowlink, element_[type].lowlink);
748  } else if (element_[type].on_stack) {
749  v.lowlink = std::min(v.lowlink, element_[type].index);
750  }
751 }
std::map< AST_Type *, Element > element_
void strong_connect(AST_Type *type, const std::string &anonymous_name)

◆ declare_get_type_map()

void typeobject_generator::declare_get_type_map ( )
private

Definition at line 559 of file typeobject_generator.cpp.

References be_global.

Referenced by typeobject_generator::Element::operator<().

560 {
562  return;
563  }
564  get_type_map_declared_ = true;
565 
566  be_global->add_include("dds/DCPS/XTypes/TypeObject.h", BE_GlobalData::STREAM_H);
567 
568  be_global->impl_ << "static const XTypes::TypeMap& get_minimal_type_map();\n";
569 
571  be_global->impl_ << "static const XTypes::TypeMap& get_complete_type_map();\n";
572  }
573 }
BE_GlobalData * be_global
Definition: be_global.cpp:43

◆ gen_enum()

bool typeobject_generator::gen_enum ( AST_Enum *  node,
UTL_ScopedName *  name,
const std::vector< AST_EnumVal *> &  contents,
const char *  repoid 
)
virtual

Reimplemented from dds_generator.

Definition at line 697 of file typeobject_generator.cpp.

References java_ts_generator::generate().

Referenced by typeobject_generator().

699 {
700  return generate(node, name);
701 }
const char *const name
Definition: debug.cpp:60
bool generate(AST_Type *node, UTL_ScopedName *name)

◆ gen_epilogue()

void typeobject_generator::gen_epilogue ( )
virtual

Reimplemented from dds_generator.

Definition at line 584 of file typeobject_generator.cpp.

References be_global.

Referenced by typeobject_generator().

585 {
586  be_global->add_include("dds/DCPS/Service_Participant.h");
587 
589  return;
590  }
591 
592  NamespaceGuard ng;
593 
594  be_global->impl_ <<
595  "namespace {\n";
596 
597  size_t idx = 0;
598  for (OpenDDS::XTypes::TypeMap::const_iterator pos = minimal_type_map_.begin();
599  pos != minimal_type_map_.end(); ++pos, ++idx) {
600  be_global->impl_ <<
601  "XTypes::TypeObject minimal_to" << idx << "()\n"
602  "{\n"
603  " const unsigned char to_bytes[] = { ";
604  dump_bytes(pos->second);
605  be_global->add_include("<stdexcept>", BE_GlobalData::STREAM_CPP);
606  be_global->impl_ <<
607  " };\n"
608  " XTypes::TypeObject to;\n"
609  " if (!to_type_object(to_bytes, sizeof(to_bytes), to)) {\n"
610  " throw std::runtime_error(\"Could not deserialize minimal Type Object " << idx << "\");\n"
611  " }\n"
612  " return to;\n"
613  "}\n\n";
614  }
615 
616  be_global->impl_ <<
617  "XTypes::TypeMap get_minimal_type_map_private()\n"
618  "{\n"
619  " XTypes::TypeMap tm;\n";
620 
621  idx = 0;
622  for (OpenDDS::XTypes::TypeMap::const_iterator pos = minimal_type_map_.begin();
623  pos != minimal_type_map_.end(); ++pos, ++idx) {
624  be_global->impl_ << " tm[" << pos->first << "] = minimal_to" << idx << "();\n";
625  }
626 
627  be_global->impl_ <<
628  " return tm;\n"
629  "}\n\n";
630 
632  idx = 0;
633  for (OpenDDS::XTypes::TypeMap::const_iterator pos = complete_type_map_.begin();
634  pos != complete_type_map_.end(); ++pos, ++idx) {
635  be_global->impl_ <<
636  "XTypes::TypeObject complete_to" << idx << "()\n"
637  "{\n"
638  " const unsigned char to_bytes[] = {\n";
639  dump_bytes(pos->second);
640  be_global->add_include("<stdexcept>", BE_GlobalData::STREAM_CPP);
641  be_global->impl_ <<
642  " };\n"
643  " XTypes::TypeObject to;\n"
644  " if (!to_type_object(to_bytes, sizeof(to_bytes), to)) {\n"
645  " throw std::runtime_error(\"Could not deserialize complete Type Object " << idx << "\");\n"
646  " }\n"
647  " return to;\n"
648  "}\n\n";
649  }
650 
651  be_global->impl_ <<
652  "XTypes::TypeMap get_complete_type_map_private()\n"
653  "{\n"
654  " XTypes::TypeMap tm;\n";
655 
656  idx = 0;
657  for (OpenDDS::XTypes::TypeMap::const_iterator pos = complete_type_map_.begin();
658  pos != complete_type_map_.end(); ++pos, ++idx) {
659  be_global->impl_ << " tm[" << pos->first << "] = complete_to" << idx << "();\n";
660  }
661 
662  be_global->impl_ <<
663  " return tm;\n"
664  "}\n";
665  }
666  be_global->impl_ << "}\n\n";
667 
668  const std::string common = "{\n"
669  " static XTypes::TypeMap tm;\n"
670  " ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, TheServiceParticipant->get_static_xtypes_lock(), tm);\n"
671  " if (tm.empty()) {\n";
672 
673  be_global->impl_ <<
674  "const XTypes::TypeMap& get_minimal_type_map()\n" << common <<
675  " tm = get_minimal_type_map_private();\n"
676  " }\n"
677  " return tm;\n"
678  "}\n\n";
679 
681  be_global->impl_ <<
682  "const XTypes::TypeMap& get_complete_type_map()\n" << common <<
683  " tm = get_complete_type_map_private();\n"
684  " }\n"
685  " return tm;\n"
686  "}\n";
687  }
688 }
OpenDDS::XTypes::TypeMap complete_type_map_
BE_GlobalData * be_global
Definition: be_global.cpp:43
OpenDDS::XTypes::TypeMap minimal_type_map_

◆ gen_struct()

bool typeobject_generator::gen_struct ( AST_Structure *  node,
UTL_ScopedName *  name,
const std::vector< AST_Field *> &  fields,
AST_Type::SIZE_TYPE  size,
const char *  repoid 
)
virtual

Implements dds_generator.

Definition at line 704 of file typeobject_generator.cpp.

References java_ts_generator::generate().

Referenced by typeobject_generator().

706 {
707  return generate(node, name);
708 }
const char *const name
Definition: debug.cpp:60
bool generate(AST_Type *node, UTL_ScopedName *name)

◆ gen_typedef()

bool typeobject_generator::gen_typedef ( AST_Typedef *  node,
UTL_ScopedName *  name,
AST_Type *  type,
const char *  repoid 
)
virtual

Implements dds_generator.

Definition at line 711 of file typeobject_generator.cpp.

References java_ts_generator::generate().

Referenced by typeobject_generator().

713 {
714  return generate(node, name);
715 }
const char *const name
Definition: debug.cpp:60
bool generate(AST_Type *node, UTL_ScopedName *name)

◆ gen_union()

bool typeobject_generator::gen_union ( AST_Union *  node,
UTL_ScopedName *  name,
const std::vector< AST_UnionBranch *> &  branches,
AST_Type *  type,
const char *  repoid 
)
virtual

Implements dds_generator.

Definition at line 718 of file typeobject_generator.cpp.

References java_ts_generator::generate().

Referenced by typeobject_generator().

721 {
722  return generate(node, name);
723 }
const char *const name
Definition: debug.cpp:60
bool generate(AST_Type *node, UTL_ScopedName *name)

◆ generate()

bool typeobject_generator::generate ( AST_Type *  node,
UTL_ScopedName *  name 
)
private

Definition at line 1708 of file typeobject_generator.cpp.

References be_global, and Function::endArgs().

Referenced by typeobject_generator::Element::operator<().

1709 {
1710  strong_connect(node, "");
1711 
1712  if (!produce_output_) {
1713  return true;
1714  }
1715 
1716  NamespaceGuard ng;
1717  const string clazz = tag_type(name);
1718 
1719  be_global->header_ << "struct " << clazz << " {};\n";
1720 
1721  const std::string common = " static XTypes::TypeIdentifier ti;\n"
1722  " ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, TheServiceParticipant->get_static_xtypes_lock(), ti);\n"
1723  " if (ti.kind() == XTypes::TK_NONE) {\n";
1724 
1725  {
1726  const string decl = "getMinimalTypeIdentifier<" + clazz + ">";
1727  Function gti(decl.c_str(), "const XTypes::TypeIdentifier&", "");
1728  gti.endArgs();
1730  be_global->impl_ << common <<
1731  " ti = " << ti << ";\n"
1732  " }\n"
1733  " return ti;\n";
1734  }
1735 
1737  {
1738  const string decl = "getMinimalTypeMap<" + clazz + ">";
1739  Function gti(decl.c_str(), "const XTypes::TypeMap&", "");
1740  gti.endArgs();
1741  be_global->impl_ <<
1742  " return get_minimal_type_map();\n";
1743  }
1744 
1746  {
1747  const string decl = "getCompleteTypeIdentifier<" + clazz + ">";
1748  Function gti(decl.c_str(), "const XTypes::TypeIdentifier&", "");
1749  gti.endArgs();
1750 
1753  be_global->impl_ << common <<
1754  " ti = " << ti << ";\n"
1755  " }\n"
1756  " return ti;\n";
1757  } else {
1758  be_global->impl_ <<
1759  " static XTypes::TypeIdentifier ti;\n"
1760  " return ti;\n";
1761  }
1762  }
1763 
1764  {
1765  const string decl = "getCompleteTypeMap<" + clazz + ">";
1766  Function gti(decl.c_str(), "const XTypes::TypeMap&", "");
1767  gti.endArgs();
1768  be_global->impl_ <<
1769  " return get_complete_type_map();\n";
1770  }
1771  }
1772 
1773  return true;
1774 }
const char *const name
Definition: debug.cpp:60
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
void endArgs()
BE_GlobalData * be_global
Definition: be_global.cpp:43
static std::string tag_type(UTL_ScopedName *name)
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)
void strong_connect(AST_Type *type, const std::string &anonymous_name)

◆ generate_alias_type_identifier()

void typeobject_generator::generate_alias_type_identifier ( AST_Type *  type)
private

Definition at line 1443 of file typeobject_generator.cpp.

References OpenDDS::XTypes::CompleteTypeObject::alias_type, OpenDDS::XTypes::MinimalTypeObject::alias_type, OpenDDS::XTypes::CompleteAliasType::body, OpenDDS::XTypes::MinimalAliasType::body, OpenDDS::XTypes::CompleteAliasBody::common, OpenDDS::XTypes::MinimalAliasBody::common, OpenDDS::XTypes::TypeObject::complete, OpenDDS::XTypes::CompleteAliasHeader::detail, OpenDDS::XTypes::EK_COMPLETE, OpenDDS::XTypes::EK_MINIMAL, OpenDDS::XTypes::CompleteAliasType::header, OpenDDS::XTypes::CompleteTypeObject::kind, OpenDDS::XTypes::MinimalTypeObject::kind, OpenDDS::XTypes::TypeObject::kind, OpenDDS::XTypes::TypeObject::minimal, OpenDDS::XTypes::CommonAliasBody::related_type, OpenDDS::XTypes::TK_ALIAS, and OpenDDS::XTypes::CompleteTypeDetail::type_name.

Referenced by typeobject_generator::Element::operator<().

1444 {
1445  AST_Typedef* const n = dynamic_cast<AST_Typedef*>(type);
1446 
1447  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1448  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1449  minimal_to.minimal.kind = OpenDDS::XTypes::TK_ALIAS;
1451 
1452  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1453  complete_to.complete.kind = OpenDDS::XTypes::TK_ALIAS;
1454  complete_to.complete.alias_type.header.detail.type_name = canonical_name(type->name());
1456 
1457  update_maps(type, minimal_to, complete_to);
1458 }
CompleteTypeObject complete
Definition: TypeObject.h:2193
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
MinimalTypeObject minimal
Definition: TypeObject.h:2194
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:134
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
const TypeKind TK_ALIAS
Definition: TypeObject.h:164
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:135
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)

◆ generate_array_type_identifier()

void typeobject_generator::generate_array_type_identifier ( AST_Type *  type,
bool  force_type_object 
)
private

Definition at line 1274 of file typeobject_generator.cpp.

References OpenDDS::XTypes::Sequence< T >::append(), OpenDDS::XTypes::CompleteTypeObject::array_type, OpenDDS::XTypes::MinimalTypeObject::array_type, be_global, OpenDDS::XTypes::CommonArrayHeader::bound_seq, OpenDDS::XTypes::CompleteCollectionElement::common, OpenDDS::XTypes::MinimalCollectionElement::common, OpenDDS::XTypes::CompleteArrayHeader::common, OpenDDS::XTypes::MinimalArrayHeader::common, OpenDDS::XTypes::TypeObject::complete, OpenDDS::XTypes::CompleteArrayHeader::detail, OpenDDS::XTypes::EK_BOTH, OpenDDS::XTypes::EK_COMPLETE, OpenDDS::XTypes::EK_MINIMAL, OpenDDS::XTypes::CompleteArrayType::element, OpenDDS::XTypes::MinimalArrayType::element, OpenDDS::XTypes::CommonCollectionElement::element_flags, OpenDDS::XTypes::CompleteArrayType::header, OpenDDS::XTypes::MinimalArrayType::header, OpenDDS::XTypes::IS_EXTERNAL, OpenDDS::XTypes::is_fully_descriptive(), OpenDDS::XTypes::CompleteTypeObject::kind, OpenDDS::XTypes::MinimalTypeObject::kind, OpenDDS::XTypes::TypeObject::kind, OpenDDS::XTypes::TypeObject::minimal, OpenDDS::XTypes::TI_PLAIN_ARRAY_LARGE, OpenDDS::XTypes::TI_PLAIN_ARRAY_SMALL, OpenDDS::XTypes::TK_ARRAY, OpenDDS::XTypes::CommonCollectionElement::type, and OpenDDS::XTypes::CompleteTypeDetail::type_name.

Referenced by typeobject_generator::Element::operator<().

1275 {
1276  AST_Array* const n = dynamic_cast<AST_Array*>(type);
1277 
1278  const TryConstructFailAction trycon = be_global->try_construct(n->base_type());
1279  OpenDDS::XTypes::CollectionElementFlag cef = try_construct_to_member_flag(trycon);
1280  if (be_global->is_external(n->base_type())) {
1282  }
1283  const OpenDDS::XTypes::TypeIdentifier minimal_elem_ti = get_minimal_type_identifier(n->base_type());
1284  const OpenDDS::XTypes::TypeIdentifier complete_elem_ti = get_complete_type_identifier(n->base_type());
1285 
1286  if (be_global->is_plain(type) && !force_type_object) {
1287  const OpenDDS::XTypes::EquivalenceKind minimal_ek =
1289  const OpenDDS::XTypes::EquivalenceKind complete_ek =
1290  minimal_ek == OpenDDS::XTypes::EK_BOTH ? minimal_ek : OpenDDS::XTypes::EK_COMPLETE;
1291 
1292  ACE_CDR::ULong max_bound = 0;
1293  for (ACE_CDR::ULong dim = 0; dim != n->n_dims(); ++dim) {
1294  max_bound = std::max(max_bound, n->dims()[dim]->ev()->u.ulval);
1295  }
1296 
1297  if (max_bound < 256) {
1299  minimal_ti.array_sdefn().header.equiv_kind = minimal_ek;
1300  minimal_ti.array_sdefn().header.element_flags = cef;
1301  for (ACE_CDR::ULong dim = 0; dim != n->n_dims(); ++dim) {
1302  minimal_ti.array_sdefn().array_bound_seq.append(n->dims()[dim]->ev()->u.ulval);
1303  }
1304  minimal_ti.array_sdefn().element_identifier = minimal_elem_ti;
1305 
1306  if (minimal_ek == OpenDDS::XTypes::EK_BOTH) {
1307  fully_desc_type_identifier_map_[type] = minimal_ti;
1308  } else {
1310  complete_ti.array_sdefn().header.equiv_kind = complete_ek;
1311  complete_ti.array_sdefn().header.element_flags = cef;
1312  complete_ti.array_sdefn().array_bound_seq = minimal_ti.array_sdefn().array_bound_seq;
1313  complete_ti.array_sdefn().element_identifier = complete_elem_ti;
1314 
1315  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1316  hash_type_identifier_map_[type] = ti_pair;
1317  }
1318  } else {
1320  minimal_ti.array_ldefn().header.equiv_kind = minimal_ek;
1321  minimal_ti.array_ldefn().header.element_flags = cef;
1322  for (ACE_CDR::ULong dim = 0; dim != n->n_dims(); ++dim) {
1323  minimal_ti.array_ldefn().array_bound_seq.append(n->dims()[dim]->ev()->u.ulval);
1324  }
1325  minimal_ti.array_ldefn().element_identifier = minimal_elem_ti;
1326 
1327  if (minimal_ek == OpenDDS::XTypes::EK_BOTH) {
1328  fully_desc_type_identifier_map_[type] = minimal_ti;
1329  } else {
1331  complete_ti.array_ldefn().header.equiv_kind = complete_ek;
1332  complete_ti.array_ldefn().header.element_flags = cef;
1333  complete_ti.array_ldefn().array_bound_seq = minimal_ti.array_ldefn().array_bound_seq;
1334  complete_ti.array_ldefn().element_identifier = complete_elem_ti;
1335 
1336  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1337  hash_type_identifier_map_[type] = ti_pair;
1338  }
1339  }
1340  } else {
1341  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1342  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1343  minimal_to.minimal.kind = OpenDDS::XTypes::TK_ARRAY;
1344  for (ACE_CDR::ULong dim = 0; dim != n->n_dims(); ++dim) {
1345  minimal_to.minimal.array_type.header.common.bound_seq.append(n->dims()[dim]->ev()->u.ulval);
1346  }
1347  minimal_to.minimal.array_type.element.common.element_flags = cef;
1348  minimal_to.minimal.array_type.element.common.type = minimal_elem_ti;
1349 
1350  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1351  complete_to.complete.kind = OpenDDS::XTypes::TK_ARRAY;
1353  complete_to.complete.array_type.header.detail.type_name = canonical_name(type->name());
1354 
1355  complete_to.complete.array_type.element.common.element_flags = cef;
1356  complete_to.complete.array_type.element.common.type = complete_elem_ti;
1357 
1358  update_maps(type, minimal_to, complete_to);
1359  }
1360 }
const TypeIdentifierKind TI_PLAIN_ARRAY_SMALL
Definition: TypeObject.h:192
CompleteTypeObject complete
Definition: TypeObject.h:2193
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
MinimalTypeObject minimal
Definition: TypeObject.h:2194
bool is_fully_descriptive(const TypeIdentifier &ti)
Definition: TypeObject.cpp:408
ACE_CDR::Octet EquivalenceKind
Definition: TypeObject.h:133
CompleteCollectionElement element
Definition: TypeObject.h:1695
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:134
BE_GlobalData * be_global
Definition: be_global.cpp:43
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
MemberFlag CollectionElementFlag
Definition: TypeObject.h:297
const TypeIdentifierKind TI_PLAIN_ARRAY_LARGE
Definition: TypeObject.h:193
MinimalCollectionElement element
Definition: TypeObject.h:1715
const MemberFlag IS_EXTERNAL
Definition: TypeObject.h:290
ACE_UINT32 ULong
TryConstructFailAction
Definition: annotations.h:316
HashTypeIdentifierMap hash_type_identifier_map_
const EquivalenceKind EK_BOTH
Definition: TypeObject.h:136
const TypeKind TK_ARRAY
Definition: TypeObject.h:178
Sequence & append(const T &member)
Definition: TypeObject.h:86
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:135
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)

◆ generate_enum_type_identifier()

void typeobject_generator::generate_enum_type_identifier ( AST_Type *  type)
private

Definition at line 1216 of file typeobject_generator.cpp.

References OpenDDS::XTypes::Sequence< T >::append(), be_global, OpenDDS::XTypes::CommonEnumeratedHeader::bit_bound, OpenDDS::XTypes::CompleteEnumeratedLiteral::common, OpenDDS::XTypes::MinimalEnumeratedLiteral::common, OpenDDS::XTypes::CompleteEnumeratedHeader::common, OpenDDS::XTypes::MinimalEnumeratedHeader::common, OpenDDS::XTypes::TypeObject::complete, OpenDDS::XTypes::CompleteEnumeratedLiteral::detail, OpenDDS::XTypes::MinimalEnumeratedLiteral::detail, OpenDDS::XTypes::CompleteEnumeratedHeader::detail, OpenDDS::XTypes::EK_COMPLETE, OpenDDS::XTypes::EK_MINIMAL, OpenDDS::XTypes::CompleteEnumeratedType::enum_flags, OpenDDS::XTypes::MinimalEnumeratedType::enum_flags, OpenDDS::XTypes::CompleteTypeObject::enumerated_type, OpenDDS::XTypes::MinimalTypeObject::enumerated_type, extensibilitykind_appendable, extensibilitykind_mutable, OpenDDS::XTypes::CommonEnumeratedLiteral::flags, OpenDDS::XTypes::hash_member_name(), OpenDDS::XTypes::CompleteEnumeratedType::header, OpenDDS::XTypes::MinimalEnumeratedType::header, OpenDDS::XTypes::IS_DEFAULT, OpenDDS::XTypes::CompleteTypeObject::kind, OpenDDS::XTypes::MinimalTypeObject::kind, OpenDDS::XTypes::TypeObject::kind, OpenDDS::XTypes::CompleteEnumeratedType::literal_seq, OpenDDS::XTypes::MinimalEnumeratedType::literal_seq, OpenDDS::XTypes::TypeObject::minimal, be_util::misc_error_and_abort(), name, OpenDDS::XTypes::CompleteMemberDetail::name, OpenDDS::XTypes::MinimalMemberDetail::name_hash, scope2vector(), OpenDDS::XTypes::Sequence< T >::sort(), OpenDDS::XTypes::TK_ENUM, OpenDDS::XTypes::CompleteTypeDetail::type_name, and OpenDDS::XTypes::CommonEnumeratedLiteral::value.

Referenced by typeobject_generator::Element::operator<().

1217 {
1218  AST_Enum* const n = dynamic_cast<AST_Enum*>(type);
1219  std::vector<AST_EnumVal*> contents;
1220  scope2vector(contents, n, AST_Decl::NT_enum_val);
1221  bool has_extensibility_annotation = false;
1222  const ExtensibilityKind ek = be_global->extensibility(type, extensibilitykind_appendable, has_extensibility_annotation);
1223 
1224  if (ek == extensibilitykind_mutable) {
1225  be_util::misc_error_and_abort("MUTABLE extensibility for enum is not allowed", type);
1226  }
1227 
1228  size_t default_literal_idx = 0;
1229  for (size_t i = 0; i != contents.size(); ++i) {
1230  if (contents[i]->annotations().find("@default_literal")) {
1231  default_literal_idx = i;
1232  break;
1233  }
1234  }
1235 
1236  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1237  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1238  minimal_to.minimal.kind = OpenDDS::XTypes::TK_ENUM;
1239  if (has_extensibility_annotation || !be_global->default_enum_extensibility_zero()) {
1240  minimal_to.minimal.enumerated_type.enum_flags = extensibility_to_type_flag(ek);
1241  }
1242  // TODO: Add support for @bit_bound.
1243  minimal_to.minimal.enumerated_type.header.common.bit_bound = 32;
1244 
1245  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1246  complete_to.complete.kind = OpenDDS::XTypes::TK_ENUM;
1247  if (has_extensibility_annotation || !be_global->default_enum_extensibility_zero()) {
1248  complete_to.complete.enumerated_type.enum_flags = extensibility_to_type_flag(ek);
1249  }
1250  complete_to.complete.enumerated_type.header.common.bit_bound = 32;
1251  complete_to.complete.enumerated_type.header.detail.type_name = canonical_name(type->name());
1252 
1253  for (size_t i = 0; i != contents.size(); ++i) {
1255  minimal_lit.common.value = contents[i]->constant_value()->ev()->u.eval;
1256  minimal_lit.common.flags = (i == default_literal_idx ? OpenDDS::XTypes::IS_DEFAULT : 0);
1257  const std::string name = canonical_name(contents[i]->local_name());
1259  minimal_to.minimal.enumerated_type.literal_seq.append(minimal_lit);
1260 
1262  complete_lit.common = minimal_lit.common;
1263  complete_lit.detail.name = name;
1264 
1265  complete_to.complete.enumerated_type.literal_seq.append(complete_lit);
1266  }
1267  minimal_to.minimal.enumerated_type.literal_seq.sort();
1268  complete_to.complete.enumerated_type.literal_seq.sort();
1269 
1270  update_maps(type, minimal_to, complete_to);
1271 }
CompleteEnumeratedHeader header
Definition: TypeObject.h:1847
void hash_member_name(NameHash &name_hash, const OPENDDS_STRING &name)
Definition: TypeObject.cpp:400
const char *const name
Definition: debug.cpp:60
CompleteTypeObject complete
Definition: TypeObject.h:2193
MinimalTypeObject minimal
Definition: TypeObject.h:2194
MinimalEnumeratedType enumerated_type
Definition: TypeObject.h:2122
void misc_error_and_abort(const std::string &message, AST_Decl *node=0)
Report a miscellaneous error and abort.
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:134
const MemberFlag IS_DEFAULT
Definition: TypeObject.h:295
BE_GlobalData * be_global
Definition: be_global.cpp:43
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
MinimalEnumeratedHeader header
Definition: TypeObject.h:1866
void scope2vector(std::vector< T *> &v, UTL_Scope *s, AST_Decl::NodeType nt)
Definition: dds_visitor.h:141
CompleteEnumeratedLiteralSeq literal_seq
Definition: TypeObject.h:1848
MinimalEnumeratedLiteralSeq literal_seq
Definition: TypeObject.h:1867
CompleteEnumeratedType enumerated_type
Definition: TypeObject.h:2019
const TypeKind TK_ENUM
Definition: TypeObject.h:167
ExtensibilityKind
Definition: annotations.h:278
Sequence & append(const T &member)
Definition: TypeObject.h:86
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:135

◆ generate_primitive_type_identifier()

void typeobject_generator::generate_primitive_type_identifier ( AST_Type *  type)
private

Definition at line 1461 of file typeobject_generator.cpp.

References be_util::misc_error_and_abort(), OpenDDS::XTypes::TK_BOOLEAN, OpenDDS::XTypes::TK_BYTE, OpenDDS::XTypes::TK_CHAR16, OpenDDS::XTypes::TK_CHAR8, OpenDDS::XTypes::TK_FLOAT128, OpenDDS::XTypes::TK_FLOAT32, OpenDDS::XTypes::TK_FLOAT64, OpenDDS::XTypes::TK_INT16, OpenDDS::XTypes::TK_INT32, OpenDDS::XTypes::TK_INT64, OpenDDS::XTypes::TK_INT8, OpenDDS::XTypes::TK_UINT16, OpenDDS::XTypes::TK_UINT32, OpenDDS::XTypes::TK_UINT64, and OpenDDS::XTypes::TK_UINT8.

Referenced by typeobject_generator::Element::operator<().

1462 {
1463  AST_PredefinedType* const n = dynamic_cast<AST_PredefinedType*>(type);
1464  switch (n->pt()) {
1465  case AST_PredefinedType::PT_long:
1467  break;
1468  case AST_PredefinedType::PT_ulong:
1470  break;
1471  case AST_PredefinedType::PT_longlong:
1473  break;
1474  case AST_PredefinedType::PT_ulonglong:
1476  break;
1477  case AST_PredefinedType::PT_short:
1479  break;
1480  case AST_PredefinedType::PT_ushort:
1482  break;
1483 #if OPENDDS_HAS_EXPLICIT_INTS
1484  case AST_PredefinedType::PT_int8:
1486  break;
1487  case AST_PredefinedType::PT_uint8:
1489  break;
1490 #endif
1491  case AST_PredefinedType::PT_float:
1493  break;
1494  case AST_PredefinedType::PT_double:
1496  break;
1497  case AST_PredefinedType::PT_longdouble:
1499  break;
1500  case AST_PredefinedType::PT_char:
1502  break;
1503  case AST_PredefinedType::PT_wchar:
1505  break;
1506  case AST_PredefinedType::PT_boolean:
1508  break;
1509  case AST_PredefinedType::PT_octet:
1511  break;
1512  case AST_PredefinedType::PT_any:
1513  case AST_PredefinedType::PT_object:
1514  case AST_PredefinedType::PT_value:
1515  case AST_PredefinedType::PT_abstract:
1516  case AST_PredefinedType::PT_void:
1517  case AST_PredefinedType::PT_pseudo:
1518  be_util::misc_error_and_abort("Unexpected primitive type");
1519  }
1520 }
const TypeKind TK_INT32
Definition: TypeObject.h:146
const TypeKind TK_UINT64
Definition: TypeObject.h:150
const TypeKind TK_UINT16
Definition: TypeObject.h:148
const TypeKind TK_FLOAT32
Definition: TypeObject.h:151
const TypeKind TK_UINT8
Definition: TypeObject.h:155
const TypeKind TK_INT8
Definition: TypeObject.h:154
void misc_error_and_abort(const std::string &message, AST_Decl *node=0)
Report a miscellaneous error and abort.
const TypeKind TK_INT64
Definition: TypeObject.h:147
const TypeKind TK_UINT32
Definition: TypeObject.h:149
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:143
const TypeKind TK_FLOAT128
Definition: TypeObject.h:153
const TypeKind TK_BYTE
Definition: TypeObject.h:144
const TypeKind TK_FLOAT64
Definition: TypeObject.h:152
const TypeKind TK_INT16
Definition: TypeObject.h:145
const TypeKind TK_CHAR8
Definition: TypeObject.h:156
const TypeKind TK_CHAR16
Definition: TypeObject.h:157

◆ generate_sequence_type_identifier()

void typeobject_generator::generate_sequence_type_identifier ( AST_Type *  type,
bool  force_type_object 
)
private

Definition at line 1363 of file typeobject_generator.cpp.

References be_global, OpenDDS::XTypes::CommonCollectionHeader::bound, OpenDDS::XTypes::CompleteCollectionElement::common, OpenDDS::XTypes::MinimalCollectionElement::common, OpenDDS::XTypes::CompleteCollectionHeader::common, OpenDDS::XTypes::MinimalCollectionHeader::common, OpenDDS::XTypes::TypeObject::complete, OpenDDS::XTypes::EK_BOTH, OpenDDS::XTypes::EK_COMPLETE, OpenDDS::XTypes::EK_MINIMAL, OpenDDS::XTypes::CompleteSequenceType::element, OpenDDS::XTypes::MinimalSequenceType::element, OpenDDS::XTypes::CommonCollectionElement::element_flags, OpenDDS::XTypes::CompleteSequenceType::header, OpenDDS::XTypes::MinimalSequenceType::header, OpenDDS::XTypes::IS_EXTERNAL, OpenDDS::XTypes::is_fully_descriptive(), OpenDDS::XTypes::CompleteTypeObject::kind, OpenDDS::XTypes::MinimalTypeObject::kind, OpenDDS::XTypes::TypeObject::kind, OpenDDS::XTypes::TypeObject::minimal, OpenDDS::XTypes::CompleteTypeObject::sequence_type, OpenDDS::XTypes::MinimalTypeObject::sequence_type, OpenDDS::XTypes::TI_PLAIN_SEQUENCE_LARGE, OpenDDS::XTypes::TI_PLAIN_SEQUENCE_SMALL, OpenDDS::XTypes::TK_SEQUENCE, and OpenDDS::XTypes::CommonCollectionElement::type.

Referenced by typeobject_generator::Element::operator<().

1364 {
1365  AST_Sequence* const n = dynamic_cast<AST_Sequence*>(type);
1366 
1367  ACE_CDR::ULong bound = 0;
1368  if (!n->unbounded()) {
1369  bound = n->max_size()->ev()->u.ulval;
1370  }
1371 
1372  const TryConstructFailAction trycon = be_global->try_construct(n->base_type());
1373  OpenDDS::XTypes::CollectionElementFlag cef = try_construct_to_member_flag(trycon);
1374  if (be_global->is_external(n->base_type())) {
1376  }
1377  const OpenDDS::XTypes::TypeIdentifier minimal_elem_ti = get_minimal_type_identifier(n->base_type());
1378  const OpenDDS::XTypes::TypeIdentifier complete_elem_ti = get_complete_type_identifier(n->base_type());
1379 
1380  if (be_global->is_plain(type) && !force_type_object) {
1381  const OpenDDS::XTypes::EquivalenceKind minimal_ek =
1383  const OpenDDS::XTypes::EquivalenceKind complete_ek =
1384  minimal_ek == OpenDDS::XTypes::EK_BOTH ? minimal_ek : OpenDDS::XTypes::EK_COMPLETE;
1385  if (bound < 256) {
1387  minimal_ti.seq_sdefn().header.equiv_kind = minimal_ek;
1388  minimal_ti.seq_sdefn().header.element_flags = cef;
1389  minimal_ti.seq_sdefn().bound = bound;
1390  minimal_ti.seq_sdefn().element_identifier = minimal_elem_ti;
1391 
1392  if (minimal_ek == OpenDDS::XTypes::EK_BOTH) {
1393  fully_desc_type_identifier_map_[type] = minimal_ti;
1394  } else {
1396  complete_ti.seq_sdefn().header.equiv_kind = complete_ek;
1397  complete_ti.seq_sdefn().header.element_flags = cef;
1398  complete_ti.seq_sdefn().bound = bound;
1399  complete_ti.seq_sdefn().element_identifier = complete_elem_ti;
1400 
1401  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1402  hash_type_identifier_map_[type] = ti_pair;
1403  }
1404  } else {
1406  minimal_ti.seq_ldefn().header.equiv_kind = minimal_ek;
1407  minimal_ti.seq_ldefn().header.element_flags = cef;
1408  minimal_ti.seq_ldefn().bound = bound;
1409  minimal_ti.seq_ldefn().element_identifier = minimal_elem_ti;
1410 
1411  if (minimal_ek == OpenDDS::XTypes::EK_BOTH) {
1412  fully_desc_type_identifier_map_[type] = minimal_ti;
1413  } else {
1415  complete_ti.seq_ldefn().header.equiv_kind = complete_ek;
1416  complete_ti.seq_ldefn().header.element_flags = cef;
1417  complete_ti.seq_ldefn().bound = bound;
1418  complete_ti.seq_ldefn().element_identifier = complete_elem_ti;
1419 
1420  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1421  hash_type_identifier_map_[type] = ti_pair;
1422  }
1423  }
1424  } else {
1425  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1426  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1428  minimal_to.minimal.sequence_type.header.common.bound = bound;
1430  minimal_to.minimal.sequence_type.element.common.type = minimal_elem_ti;
1431 
1432  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1434  complete_to.complete.sequence_type.header.common.bound = bound;
1436  complete_to.complete.sequence_type.element.common.type = complete_elem_ti;
1437 
1438  update_maps(type, minimal_to, complete_to);
1439  }
1440 }
MinimalSequenceType sequence_type
Definition: TypeObject.h:2119
CompleteCollectionElement element
Definition: TypeObject.h:1622
CompleteTypeObject complete
Definition: TypeObject.h:2193
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
MinimalTypeObject minimal
Definition: TypeObject.h:2194
CompleteCollectionHeader header
Definition: TypeObject.h:1621
bool is_fully_descriptive(const TypeIdentifier &ti)
Definition: TypeObject.cpp:408
ACE_CDR::Octet EquivalenceKind
Definition: TypeObject.h:133
MinimalCollectionHeader header
Definition: TypeObject.h:1641
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:134
CompleteSequenceType sequence_type
Definition: TypeObject.h:2016
BE_GlobalData * be_global
Definition: be_global.cpp:43
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
MemberFlag CollectionElementFlag
Definition: TypeObject.h:297
MinimalCollectionElement element
Definition: TypeObject.h:1642
const MemberFlag IS_EXTERNAL
Definition: TypeObject.h:290
const TypeIdentifierKind TI_PLAIN_SEQUENCE_LARGE
Definition: TypeObject.h:190
ACE_UINT32 ULong
TryConstructFailAction
Definition: annotations.h:316
HashTypeIdentifierMap hash_type_identifier_map_
const EquivalenceKind EK_BOTH
Definition: TypeObject.h:136
const TypeIdentifierKind TI_PLAIN_SEQUENCE_SMALL
Definition: TypeObject.h:189
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:135
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:177

◆ generate_struct_type_identifier()

void typeobject_generator::generate_struct_type_identifier ( AST_Type *  type)
private

Definition at line 1040 of file typeobject_generator.cpp.

References OpenDDS::XTypes::CompleteMemberDetail::ann_builtin, OpenDDS::XTypes::Sequence< T >::append(), autoidkind_hash, OpenDDS::XTypes::CompleteStructHeader::base_type, OpenDDS::XTypes::MinimalStructHeader::base_type, be_global, Fields::begin(), OpenDDS::XTypes::CompleteStructMember::common, OpenDDS::XTypes::MinimalStructMember::common, OpenDDS::XTypes::TypeObject::complete, OpenDDS::XTypes::CompleteStructMember::detail, OpenDDS::XTypes::MinimalStructMember::detail, OpenDDS::XTypes::CompleteStructHeader::detail, OpenDDS::XTypes::EK_COMPLETE, OpenDDS::XTypes::EK_MINIMAL, Fields::end(), OpenDDS::XTypes::hash_member_name(), OpenDDS::XTypes::CompleteStructType::header, OpenDDS::XTypes::MinimalStructType::header, OpenDDS::XTypes::IS_AUTOID_HASH, OpenDDS::XTypes::IS_EXTERNAL, OpenDDS::XTypes::IS_KEY, OpenDDS::XTypes::IS_MUST_UNDERSTAND, OpenDDS::XTypes::IS_NESTED, OpenDDS::XTypes::IS_OPTIONAL, OpenDDS::XTypes::CompleteTypeObject::kind, OpenDDS::XTypes::MinimalTypeObject::kind, OpenDDS::XTypes::TypeObject::kind, OpenDDS::XTypes::CommonStructMember::member_flags, OpenDDS::XTypes::CommonStructMember::member_id, OpenDDS::XTypes::CompleteStructType::member_seq, OpenDDS::XTypes::MinimalStructType::member_seq, OpenDDS::XTypes::CommonStructMember::member_type_id, OpenDDS::XTypes::TypeObject::minimal, name, OpenDDS::XTypes::CompleteMemberDetail::name, OpenDDS::XTypes::MinimalMemberDetail::name_hash, OpenDDS::XTypes::Sequence< T >::sort(), OpenDDS::XTypes::CompleteStructType::struct_flags, OpenDDS::XTypes::MinimalStructType::struct_flags, OpenDDS::XTypes::CompleteTypeObject::struct_type, OpenDDS::XTypes::MinimalTypeObject::struct_type, OpenDDS::XTypes::TK_NONE, OpenDDS::XTypes::TK_STRUCTURE, and OpenDDS::XTypes::CompleteTypeDetail::type_name.

Referenced by typeobject_generator::Element::operator<().

1041 {
1042  AST_Structure* const n = dynamic_cast<AST_Structure*>(type);
1043  const Fields fields(n);
1044 
1045  const ExtensibilityKind exten = be_global->extensibility(n);
1046  const AutoidKind auto_id = be_global->autoid(n);
1047 
1048  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1049  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1051 
1052  minimal_to.minimal.struct_type.struct_flags = extensibility_to_type_flag(exten);
1053 
1054  if (be_global->is_nested(n)) {
1056  }
1057 
1058  if (auto_id == autoidkind_hash) {
1060  }
1061 
1062  // TODO: Support inheritance.
1064 
1065  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1067 
1070  complete_to.complete.struct_type.header.detail.type_name = canonical_name(type->name());
1071  // @verbatim and custom annotations are not supported.
1072 
1073  for (Fields::Iterator i = fields.begin(); i != fields.end(); ++i) {
1074  AST_Field* field = *i;
1075  const TryConstructFailAction trycon = be_global->try_construct(field);
1076 
1077  OpenDDS::XTypes::MinimalStructMember minimal_member;
1078  minimal_member.common.member_id = be_global->get_id(field);
1079  minimal_member.common.member_flags = try_construct_to_member_flag(trycon);
1080 
1081  if (be_global->is_optional(field)) {
1083  }
1084 
1085  if (be_global->is_must_understand(field)) {
1087  }
1088 
1089  if (be_global->is_key(field)) {
1090  minimal_member.common.member_flags |= OpenDDS::XTypes::IS_KEY;
1091  }
1092 
1093  if (be_global->is_external(field)) {
1095  }
1096 
1097  minimal_member.common.member_type_id = get_minimal_type_identifier(field->field_type());
1098  const std::string name = canonical_name(field->local_name());
1099  OpenDDS::XTypes::hash_member_name(minimal_member.detail.name_hash, name);
1100  minimal_to.minimal.struct_type.member_seq.append(minimal_member);
1101 
1102  OpenDDS::XTypes::CompleteStructMember complete_member;
1103  complete_member.common.member_id = minimal_member.common.member_id;
1104  complete_member.common.member_flags = minimal_member.common.member_flags;
1105  complete_member.common.member_type_id = get_complete_type_identifier(field->field_type());
1106 
1107  complete_member.detail.name = name;
1108  set_builtin_member_annotations(field, complete_member.detail.ann_builtin);
1109 
1110  complete_to.complete.struct_type.member_seq.append(complete_member);
1111  }
1112 
1113  minimal_to.minimal.struct_type.member_seq.sort();
1114  complete_to.complete.struct_type.member_seq.sort();
1115 
1116  update_maps(type, minimal_to, complete_to);
1117 }
void hash_member_name(NameHash &name_hash, const OPENDDS_STRING &name)
Definition: TypeObject.cpp:400
const char *const name
Definition: debug.cpp:60
CompleteTypeObject complete
Definition: TypeObject.h:2193
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
MinimalTypeObject minimal
Definition: TypeObject.h:2194
Optional< AppliedBuiltinMemberAnnotations > ann_builtin
Definition: TypeObject.h:1058
const TypeKind TK_NONE
Definition: TypeObject.h:142
AutoidKind
Definition: annotations.h:217
const MemberFlag IS_OPTIONAL
Definition: TypeObject.h:292
const TypeFlag IS_AUTOID_HASH
Definition: TypeObject.h:324
const TypeFlag IS_NESTED
Definition: TypeObject.h:323
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:134
BE_GlobalData * be_global
Definition: be_global.cpp:43
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
const MemberFlag IS_KEY
Definition: TypeObject.h:294
const MemberFlag IS_EXTERNAL
Definition: TypeObject.h:290
TryConstructFailAction
Definition: annotations.h:316
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:172
MinimalStructMemberSeq member_seq
Definition: TypeObject.h:1210
const MemberFlag IS_MUST_UNDERSTAND
Definition: TypeObject.h:293
void set_builtin_member_annotations(AST_Decl *member, OpenDDS::XTypes::Optional< OpenDDS::XTypes::AppliedBuiltinMemberAnnotations > &annotations)
ExtensibilityKind
Definition: annotations.h:278
Sequence & append(const T &member)
Definition: TypeObject.h:86
CompleteStructMemberSeq member_seq
Definition: TypeObject.h:1192
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:135
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)

◆ generate_type_identifier()

void typeobject_generator::generate_type_identifier ( AST_Type *  type,
bool  force_type_object 
)
private

Definition at line 1523 of file typeobject_generator.cpp.

References be_util::misc_error_and_abort(), OpenDDS::XTypes::TI_STRING16_LARGE, OpenDDS::XTypes::TI_STRING16_SMALL, OpenDDS::XTypes::TI_STRING8_LARGE, OpenDDS::XTypes::TI_STRING8_SMALL, and OpenDDS::XTypes::TK_NONE.

Referenced by typeobject_generator::Element::operator<().

1524 {
1525  // Generate both minimal and complete identifiers (and type objects) and cache.
1526  switch (type->node_type()) {
1527 
1528  case AST_ConcreteType::NT_union:
1529  {
1531  break;
1532  }
1533 
1534  case AST_ConcreteType::NT_struct:
1535  {
1537  break;
1538  }
1539 
1540  case AST_ConcreteType::NT_enum:
1541  {
1543  break;
1544  }
1545 
1546  case AST_ConcreteType::NT_string:
1547  {
1548  AST_String* const n = dynamic_cast<AST_String*>(type);
1549  ACE_CDR::ULong bound = n->max_size()->ev()->u.ulval;
1550  if (bound < 256) {
1552  ti.string_sdefn().bound = bound;
1554  } else {
1556  ti.string_ldefn().bound = bound;
1558  }
1559  break;
1560  }
1561 
1562  case AST_ConcreteType::NT_wstring:
1563  {
1564  AST_String* const n = dynamic_cast<AST_String*>(type);
1565  ACE_CDR::ULong bound = n->max_size()->ev()->u.ulval;
1566  if (bound < 256) {
1568  ti.string_sdefn().bound = bound;
1570  } else {
1572  ti.string_ldefn().bound = bound;
1574  }
1575  break;
1576  }
1577 
1578  case AST_ConcreteType::NT_array:
1579  {
1580  generate_array_type_identifier(type, force_type_object);
1581  break;
1582  }
1583 
1584  case AST_ConcreteType::NT_sequence:
1585  {
1586  generate_sequence_type_identifier(type, force_type_object);
1587  break;
1588  }
1589 
1590  case AST_ConcreteType::NT_typedef:
1591  {
1593  break;
1594  }
1595 
1596  case AST_ConcreteType::NT_pre_defined:
1597  {
1599  break;
1600  }
1601 
1602  case AST_ConcreteType::NT_fixed:
1603  case AST_ConcreteType::NT_interface:
1604  case AST_ConcreteType::NT_interface_fwd:
1605  {
1607  break;
1608  }
1609 
1610  case AST_ConcreteType::NT_struct_fwd:
1611  case AST_ConcreteType::NT_union_fwd:
1612  case AST_ConcreteType::NT_native:
1613  case AST_ConcreteType::NT_factory:
1614  case AST_ConcreteType::NT_finder:
1615  case AST_ConcreteType::NT_component:
1616  case AST_ConcreteType::NT_component_fwd:
1617  case AST_ConcreteType::NT_home:
1618  case AST_ConcreteType::NT_eventtype:
1619  case AST_ConcreteType::NT_eventtype_fwd:
1620  case AST_ConcreteType::NT_valuebox:
1621  case AST_ConcreteType::NT_type:
1622  case AST_ConcreteType::NT_porttype:
1623  case AST_ConcreteType::NT_provides:
1624  case AST_ConcreteType::NT_uses:
1625  case AST_ConcreteType::NT_publishes:
1626  case AST_ConcreteType::NT_emits:
1627  case AST_ConcreteType::NT_consumes:
1628  case AST_ConcreteType::NT_ext_port:
1629  case AST_ConcreteType::NT_mirror_port:
1630  case AST_ConcreteType::NT_connector:
1631  case AST_ConcreteType::NT_param_holder:
1632  case AST_ConcreteType::NT_annotation_decl:
1633  case AST_ConcreteType::NT_annotation_appl:
1634  case AST_ConcreteType::NT_annotation_member:
1635  case AST_ConcreteType::NT_module:
1636  case AST_ConcreteType::NT_root:
1637  case AST_ConcreteType::NT_valuetype:
1638  case AST_ConcreteType::NT_valuetype_fwd:
1639  case AST_ConcreteType::NT_const:
1640  case AST_ConcreteType::NT_except:
1641  case AST_ConcreteType::NT_attr:
1642  case AST_ConcreteType::NT_op:
1643  case AST_ConcreteType::NT_argument:
1644  case AST_ConcreteType::NT_union_branch:
1645  case AST_ConcreteType::NT_field:
1646  case AST_ConcreteType::NT_enum_val:
1647  be_util::misc_error_and_abort("Unexpected AST type", type);
1648  }
1649 }
void generate_struct_type_identifier(AST_Type *type)
void generate_sequence_type_identifier(AST_Type *type, bool force_type_object)
void generate_enum_type_identifier(AST_Type *type)
const TypeIdentifierKind TI_STRING16_LARGE
Definition: TypeObject.h:187
const TypeKind TK_NONE
Definition: TypeObject.h:142
void misc_error_and_abort(const std::string &message, AST_Decl *node=0)
Report a miscellaneous error and abort.
const TypeIdentifierKind TI_STRING8_SMALL
Definition: TypeObject.h:184
void generate_alias_type_identifier(AST_Type *type)
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
const TypeIdentifierKind TI_STRING8_LARGE
Definition: TypeObject.h:185
ACE_UINT32 ULong
void generate_union_type_identifier(AST_Type *type)
void generate_primitive_type_identifier(AST_Type *type)
void generate_array_type_identifier(AST_Type *type, bool force_type_object)
const TypeIdentifierKind TI_STRING16_SMALL
Definition: TypeObject.h:186

◆ generate_union_type_identifier()

void typeobject_generator::generate_union_type_identifier ( AST_Type *  type)
private

Definition at line 1120 of file typeobject_generator.cpp.

References OpenDDS::XTypes::CompleteMemberDetail::ann_builtin, OpenDDS::XTypes::Sequence< T >::append(), autoidkind_hash, be_global, Fields::begin(), OpenDDS::XTypes::CompleteUnionMember::common, OpenDDS::XTypes::MinimalUnionMember::common, OpenDDS::XTypes::CompleteDiscriminatorMember::common, OpenDDS::XTypes::MinimalDiscriminatorMember::common, OpenDDS::XTypes::TypeObject::complete, OpenDDS::XTypes::CompleteUnionMember::detail, OpenDDS::XTypes::MinimalUnionMember::detail, OpenDDS::XTypes::CompleteUnionHeader::detail, OpenDDS::XTypes::CompleteUnionType::discriminator, OpenDDS::XTypes::MinimalUnionType::discriminator, OpenDDS::XTypes::EK_COMPLETE, OpenDDS::XTypes::EK_MINIMAL, Fields::end(), OpenDDS::XTypes::hash_member_name(), OpenDDS::XTypes::CompleteUnionType::header, OpenDDS::XTypes::IS_AUTOID_HASH, OpenDDS::XTypes::IS_DEFAULT, OpenDDS::XTypes::IS_EXTERNAL, OpenDDS::XTypes::IS_KEY, OpenDDS::XTypes::IS_NESTED, OpenDDS::XTypes::CompleteTypeObject::kind, OpenDDS::XTypes::MinimalTypeObject::kind, OpenDDS::XTypes::TypeObject::kind, OpenDDS::XTypes::CommonUnionMember::label_seq, OpenDDS::XTypes::CommonUnionMember::member_flags, OpenDDS::XTypes::CommonDiscriminatorMember::member_flags, OpenDDS::XTypes::CommonUnionMember::member_id, OpenDDS::XTypes::CompleteUnionType::member_seq, OpenDDS::XTypes::MinimalUnionType::member_seq, OpenDDS::XTypes::TypeObject::minimal, name, OpenDDS::XTypes::CompleteMemberDetail::name, OpenDDS::XTypes::MinimalMemberDetail::name_hash, OpenDDS::XTypes::Sequence< T >::sort(), OpenDDS::XTypes::TK_UNION, OpenDDS::XTypes::CommonUnionMember::type_id, OpenDDS::XTypes::CommonDiscriminatorMember::type_id, OpenDDS::XTypes::CompleteTypeDetail::type_name, OpenDDS::XTypes::CompleteUnionType::union_flags, OpenDDS::XTypes::MinimalUnionType::union_flags, OpenDDS::XTypes::CompleteTypeObject::union_type, and OpenDDS::XTypes::MinimalTypeObject::union_type.

Referenced by typeobject_generator::Element::operator<().

1121 {
1122  AST_Union* const n = dynamic_cast<AST_Union*>(type);
1123  AST_Type* discriminator = n->disc_type();
1124  const Fields fields(n);
1125 
1126  const ExtensibilityKind exten = be_global->extensibility(n);
1127  const AutoidKind auto_id = be_global->autoid(n);
1128 
1129  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1130  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1131  minimal_to.minimal.kind = OpenDDS::XTypes::TK_UNION;
1132  minimal_to.minimal.union_type.union_flags = extensibility_to_type_flag(exten);
1133 
1134  if (be_global->is_nested(n)) {
1136  }
1137 
1138  if (auto_id == autoidkind_hash) {
1140  }
1141 
1142  const TryConstructFailAction trycon = be_global->union_discriminator_try_construct(n);
1143  minimal_to.minimal.union_type.discriminator.common.member_flags = try_construct_to_member_flag(trycon);
1144  if (be_global->union_discriminator_is_key(n)) {
1146  }
1148 
1149  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1150  complete_to.complete.kind = OpenDDS::XTypes::TK_UNION;
1151  complete_to.complete.union_type.union_flags = minimal_to.minimal.union_type.union_flags;
1152 
1153  complete_to.complete.union_type.header.detail.type_name = canonical_name(type->name());
1154 
1158 
1159  for (Fields::Iterator i = fields.begin(); i != fields.end(); ++i) {
1160  AST_UnionBranch* branch = dynamic_cast<AST_UnionBranch*>(*i);
1161  const TryConstructFailAction trycon = be_global->try_construct(branch);
1162 
1163  bool is_default = false;
1164  for (unsigned long j = 0; j < branch->label_list_length(); ++j) {
1165  AST_UnionLabel* label = branch->label(j);
1166  if (label->label_kind() == AST_UnionLabel::UL_default) {
1167  is_default = true;
1168  break;
1169  }
1170  }
1171 
1172  OpenDDS::XTypes::MinimalUnionMember minimal_member;
1173  minimal_member.common.member_id = be_global->get_id(branch);
1174  minimal_member.common.member_flags = try_construct_to_member_flag(trycon);
1175 
1176  if (is_default) {
1178  }
1179 
1180  if (be_global->is_external(branch)) {
1182  }
1183 
1184  minimal_member.common.type_id = get_minimal_type_identifier(branch->field_type());
1185 
1186  for (unsigned long j = 0; j < branch->label_list_length(); ++j) {
1187  AST_UnionLabel* label = branch->label(j);
1188  if (label->label_kind() != AST_UnionLabel::UL_default) {
1189  minimal_member.common.label_seq.append(to_long(*label->label_val()->ev()));
1190  }
1191  }
1192  minimal_member.common.label_seq.sort();
1193 
1194  const std::string name = canonical_name(branch->local_name());
1195  OpenDDS::XTypes::hash_member_name(minimal_member.detail.name_hash, name);
1196  minimal_to.minimal.union_type.member_seq.append(minimal_member);
1197 
1198  OpenDDS::XTypes::CompleteUnionMember complete_member;
1199  complete_member.common.member_id = minimal_member.common.member_id;
1200  complete_member.common.member_flags = minimal_member.common.member_flags;
1201  complete_member.common.type_id = get_complete_type_identifier(branch->field_type());
1202  complete_member.common.label_seq = minimal_member.common.label_seq;
1203 
1204  complete_member.detail.name = name;
1205  set_builtin_member_annotations(branch, complete_member.detail.ann_builtin);
1206 
1207  complete_to.complete.union_type.member_seq.append(complete_member);
1208  }
1209  minimal_to.minimal.union_type.member_seq.sort();
1210  complete_to.complete.union_type.member_seq.sort();
1211 
1212  update_maps(type, minimal_to, complete_to);
1213 }
MinimalDiscriminatorMember discriminator
Definition: TypeObject.h:1382
void hash_member_name(NameHash &name_hash, const OPENDDS_STRING &name)
Definition: TypeObject.cpp:400
const char *const name
Definition: debug.cpp:60
CompleteTypeObject complete
Definition: TypeObject.h:2193
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
MinimalTypeObject minimal
Definition: TypeObject.h:2194
Optional< AppliedBuiltinMemberAnnotations > ann_builtin
Definition: TypeObject.h:1058
AutoidKind
Definition: annotations.h:217
const TypeFlag IS_AUTOID_HASH
Definition: TypeObject.h:324
const TypeFlag IS_NESTED
Definition: TypeObject.h:323
MinimalUnionMemberSeq member_seq
Definition: TypeObject.h:1383
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:134
const MemberFlag IS_DEFAULT
Definition: TypeObject.h:295
BE_GlobalData * be_global
Definition: be_global.cpp:43
CompleteDiscriminatorMember discriminator
Definition: TypeObject.h:1361
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
const MemberFlag IS_KEY
Definition: TypeObject.h:294
const MemberFlag IS_EXTERNAL
Definition: TypeObject.h:290
const TypeKind TK_UNION
Definition: TypeObject.h:173
TryConstructFailAction
Definition: annotations.h:316
CompleteUnionMemberSeq member_seq
Definition: TypeObject.h:1362
void set_builtin_member_annotations(AST_Decl *member, OpenDDS::XTypes::Optional< OpenDDS::XTypes::AppliedBuiltinMemberAnnotations > &annotations)
ExtensibilityKind
Definition: annotations.h:278
Sequence & append(const T &member)
Definition: TypeObject.h:86
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:135
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)

◆ get_complete_type_identifier()

OpenDDS::XTypes::TypeIdentifier typeobject_generator::get_complete_type_identifier ( AST_Type *  type)
private

Definition at line 1681 of file typeobject_generator.cpp.

References OPENDDS_ASSERT.

Referenced by typeobject_generator::Element::operator<().

1682 {
1683  switch(type->node_type()) {
1684  case AST_Decl::NT_union_fwd:
1685  {
1686  AST_UnionFwd* const td = dynamic_cast<AST_UnionFwd*>(type);
1687  return get_complete_type_identifier(td->full_definition());
1688  }
1689  case AST_Decl::NT_struct_fwd:
1690  {
1691  AST_StructureFwd* const td = dynamic_cast<AST_StructureFwd*>(type);
1692  return get_complete_type_identifier(td->full_definition());
1693  }
1694  default:
1695  break;
1696  }
1697 
1698  if (fully_desc_type_identifier_map_.count(type) != 0) {
1699  return fully_desc_type_identifier_map_[type];
1700  }
1701 
1702  HashTypeIdentifierMap::const_iterator pos = hash_type_identifier_map_.find(type);
1704  return pos->second.complete;
1705 }
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
HashTypeIdentifierMap hash_type_identifier_map_
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:66

◆ get_minimal_type_identifier()

OpenDDS::XTypes::TypeIdentifier typeobject_generator::get_minimal_type_identifier ( AST_Type *  type)
private

Definition at line 1653 of file typeobject_generator.cpp.

References OPENDDS_ASSERT.

Referenced by typeobject_generator::Element::operator<().

1654 {
1655  switch(type->node_type()) {
1656  case AST_Decl::NT_union_fwd:
1657  {
1658  AST_UnionFwd* const td = dynamic_cast<AST_UnionFwd*>(type);
1659  return get_minimal_type_identifier(td->full_definition());
1660  }
1661  case AST_Decl::NT_struct_fwd:
1662  {
1663  AST_StructureFwd* const td = dynamic_cast<AST_StructureFwd*>(type);
1664  return get_minimal_type_identifier(td->full_definition());
1665  }
1666  default:
1667  break;
1668  }
1669 
1670  if (fully_desc_type_identifier_map_.count(type) != 0) {
1671  return fully_desc_type_identifier_map_[type];
1672  }
1673 
1674  HashTypeIdentifierMap::const_iterator pos = hash_type_identifier_map_.find(type);
1676  return pos->second.minimal;
1677 }
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
HashTypeIdentifierMap hash_type_identifier_map_
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:66
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)

◆ produce_output()

void typeobject_generator::produce_output ( bool  flag)
inline

Definition at line 41 of file typeobject_generator.h.

References produce_output_.

42  {
43  produce_output_ = flag;
44  }

◆ produce_xtypes_complete()

void typeobject_generator::produce_xtypes_complete ( bool  flag)
inline

Definition at line 46 of file typeobject_generator.h.

References produce_xtypes_complete_, and use_old_typeobject_encoding().

47  {
49  }

◆ set_builtin_member_annotations()

void typeobject_generator::set_builtin_member_annotations ( AST_Decl *  member,
OpenDDS::XTypes::Optional< OpenDDS::XTypes::AppliedBuiltinMemberAnnotations > &  annotations 
)
private

Definition at line 1026 of file typeobject_generator.cpp.

References be_global, OpenDDS::XTypes::AppliedBuiltinMemberAnnotations::hash_id, AnnotationWithValue< T >::node_value_exists(), OpenDDS::XTypes::Optional< T >::present, and OpenDDS::XTypes::Optional< T >::value.

Referenced by typeobject_generator::Element::operator<().

1028 {
1029  // Support only @hashid annotation for member at this time.
1030  const HashidAnnotation* hashid_ann = dynamic_cast<const HashidAnnotation*>(be_global->builtin_annotations_["::@hashid"]);
1031  std::string hash_name;
1032  if (hashid_ann->node_value_exists(member, hash_name)) {
1033  annotations.present = true;
1034  annotations.value.hash_id.present = true;
1035  annotations.value.hash_id.value = hash_name;
1036  }
1037 }
BE_GlobalData * be_global
Definition: be_global.cpp:43
virtual bool node_value_exists(AST_Decl *node, T &value) const
Definition: annotations.h:117

◆ strong_connect()

void typeobject_generator::strong_connect ( AST_Type *  type,
const std::string &  anonymous_name 
)
private

Definition at line 754 of file typeobject_generator.cpp.

References OpenDDS::XTypes::Sequence< T >::append(), be_global, Fields::begin(), OpenDDS::XTypes::EK_COMPLETE, OpenDDS::XTypes::EK_MINIMAL, OpenDDS::STUN::encoding(), Fields::end(), OpenDDS::XTypes::get_typeobject_encoding(), typeobject_generator::Element::index, OpenDDS::XTypes::TypeIdentifier::kind(), ACE_Message_Block::length(), typeobject_generator::Element::lowlink, OpenDDS::DCPS::MD5Hash(), be_util::misc_error_and_abort(), typeobject_generator::Element::name, typeobject_generator::Element::on_stack, OPENDDS_ASSERT, ACE_Message_Block::rd_ptr(), OpenDDS::DCPS::serialized_size(), OpenDDS::XTypes::TI_STRONGLY_CONNECTED_COMPONENT, OpenDDS::DCPS::to_dds_string(), and typeobject_generator::Element::type.

Referenced by typeobject_generator::Element::operator<().

755 {
756  switch (type->node_type()) {
757  case AST_ConcreteType::NT_union_fwd:
758  {
759  AST_UnionFwd* const n = dynamic_cast<AST_UnionFwd*>(type);
760  type = n->full_definition();
761  break;
762  }
763  case AST_ConcreteType::NT_struct_fwd:
764  {
765  AST_StructureFwd* const n = dynamic_cast<AST_StructureFwd*>(type);
766  type = n->full_definition();
767  break;
768  }
769  default:
770  break;
771  }
772 
773  Element& v = element_[type];
774  v.type = type;
775  v.index = index_;
776  v.lowlink = index_;
777  ++index_;
778  stack_.push_back(type);
779  v.on_stack = true;
780 
782  AST_Structure* const stru = dynamic_cast<AST_Structure*>(type);
783  switch (type->node_type()) {
784 
785  case AST_ConcreteType::NT_union:
786  {
787  AST_Union* const n = dynamic_cast<AST_Union*>(type);
788  v.name = canonical_name(n->name());
789 
790  AST_Type* discriminator = n->disc_type();
791  const Fields fields(n);
792 
793  consider(v, discriminator, v.name + ".d");
794 
795  const AutoidKind auto_id = be_global->autoid(n);
796  MemberId member_id = 0;
797 
798  for (Fields::Iterator i = fields.begin(); i != fields.end(); ++i) {
799  AST_UnionBranch* ub = dynamic_cast<AST_UnionBranch*>(*i);
800  const MemberId id = be_global->compute_id(stru, ub, auto_id, member_id);
801  consider(v, ub->field_type(), v.name + "." + OpenDDS::DCPS::to_dds_string(id));
802  }
803 
804  break;
805  }
806 
807  case AST_ConcreteType::NT_struct:
808  {
809  AST_Structure* const n = dynamic_cast<AST_Structure*>(type);
810  v.name = canonical_name(n->name());
811 
812  // TODO: Struct inheritance.
813 
814  const Fields fields(n);
815  const AutoidKind auto_id = be_global->autoid(n);
816  MemberId member_id = 0;
817 
818  for (Fields::Iterator i = fields.begin(); i != fields.end(); ++i) {
819  AST_Field* field = *i;
820  const MemberId id = be_global->compute_id(stru, field, auto_id, member_id);
821  consider(v, field->field_type(), v.name + "." + OpenDDS::DCPS::to_dds_string(id));
822  }
823 
824  break;
825  }
826 
827  case AST_ConcreteType::NT_array:
828  {
829  AST_Array* const n = dynamic_cast<AST_Array*>(type);
830  v.name = anonymous_name + ".a";
831  consider(v, n->base_type(), v.name);
832  break;
833  }
834 
835  case AST_ConcreteType::NT_sequence:
836  {
837  AST_Sequence* const n = dynamic_cast<AST_Sequence*>(type);
838  v.name = anonymous_name + ".s";
839  consider(v, n->base_type(), v.name);
840  break;
841  }
842 
843  case AST_ConcreteType::NT_typedef:
844  {
845  AST_Typedef* const n = dynamic_cast<AST_Typedef*>(type);
846  v.name = canonical_name(n->name());
847  // TODO: What is the member name for an anonymous type in a typedef?
848  // 7.3.4.9.2
849  consider(v, n->base_type(), v.name + ".0");
850  break;
851  }
852 
853  case AST_ConcreteType::NT_enum:
854  {
855  AST_Enum* const n = dynamic_cast<AST_Enum*>(type);
856  v.name = canonical_name(n->name());
857  break;
858  }
859 
860  case AST_ConcreteType::NT_string:
861  case AST_ConcreteType::NT_wstring:
862  case AST_ConcreteType::NT_pre_defined:
863  case AST_ConcreteType::NT_fixed:
864  case AST_ConcreteType::NT_interface:
865  case AST_ConcreteType::NT_interface_fwd:
866  break;
867 
868  case AST_ConcreteType::NT_struct_fwd:
869  case AST_ConcreteType::NT_union_fwd:
870  case AST_ConcreteType::NT_native:
871  case AST_ConcreteType::NT_factory:
872  case AST_ConcreteType::NT_finder:
873  case AST_ConcreteType::NT_component:
874  case AST_ConcreteType::NT_component_fwd:
875  case AST_ConcreteType::NT_home:
876  case AST_ConcreteType::NT_eventtype:
877  case AST_ConcreteType::NT_eventtype_fwd:
878  case AST_ConcreteType::NT_valuebox:
879  case AST_ConcreteType::NT_type:
880  case AST_ConcreteType::NT_porttype:
881  case AST_ConcreteType::NT_provides:
882  case AST_ConcreteType::NT_uses:
883  case AST_ConcreteType::NT_publishes:
884  case AST_ConcreteType::NT_emits:
885  case AST_ConcreteType::NT_consumes:
886  case AST_ConcreteType::NT_ext_port:
887  case AST_ConcreteType::NT_mirror_port:
888  case AST_ConcreteType::NT_connector:
889  case AST_ConcreteType::NT_param_holder:
890  case AST_ConcreteType::NT_annotation_decl:
891  case AST_ConcreteType::NT_annotation_appl:
892  case AST_ConcreteType::NT_annotation_member:
893  case AST_ConcreteType::NT_module:
894  case AST_ConcreteType::NT_root:
895  case AST_ConcreteType::NT_valuetype:
896  case AST_ConcreteType::NT_valuetype_fwd:
897  case AST_ConcreteType::NT_const:
898  case AST_ConcreteType::NT_except:
899  case AST_ConcreteType::NT_attr:
900  case AST_ConcreteType::NT_op:
901  case AST_ConcreteType::NT_argument:
902  case AST_ConcreteType::NT_union_branch:
903  case AST_ConcreteType::NT_field:
904  case AST_ConcreteType::NT_enum_val:
905  be_util::misc_error_and_abort("Unexpected AST type", type);
906  break;
907  }
908 
909  if (v.lowlink == v.index) {
910  typedef std::vector<Element> List;
911  List scc;
912  AST_Type* wt;
913  do {
914  wt = stack_.back();
915  stack_.pop_back();
916  Element& w = element_[wt];
917  w.on_stack = false;
918  scc.push_back(w);
919  } while (wt != v.type);
920 
921  // Sort types in SCC using lexicographic order of their fully qualified names.
922  std::sort(scc.begin(), scc.end());
923 
924  if (scc.size() == 1) {
925  generate_type_identifier(scc[0].type, false);
926  } else {
927  // Compute temporary type identifiers for the types in SCC with hash value of zero.
929  minimal_ti.sc_component_id().sc_component_id.kind = OpenDDS::XTypes::EK_MINIMAL;
930  std::memset(&minimal_ti.sc_component_id().sc_component_id.hash, 0, sizeof(OpenDDS::XTypes::EquivalenceHash));
931  minimal_ti.sc_component_id().scc_length = static_cast<int>(scc.size());
932 
933  OpenDDS::XTypes::TypeIdentifier complete_ti = minimal_ti;
934  complete_ti.sc_component_id().sc_component_id.kind = OpenDDS::XTypes::EK_COMPLETE;
935 
936  {
937  size_t idx = 0;
938  for (List::const_iterator pos = scc.begin(); pos != scc.end(); ++pos) {
939  minimal_ti.sc_component_id().scc_index = static_cast<int>(++idx); // Starts at 1.
940  complete_ti.sc_component_id().scc_index = minimal_ti.sc_component_id().scc_index;
941  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
942  hash_type_identifier_map_[pos->type] = ti_pair;
943  }
944  }
945 
946  // Construct temporary type objects from the temporary type identifiers.
947  OpenDDS::XTypes::TypeObjectSeq minimal_seq, complete_seq;
948  for (List::const_iterator pos = scc.begin(); pos != scc.end(); ++pos) {
949  generate_type_identifier(pos->type, true);
950  OPENDDS_ASSERT(type_object_map_.count(pos->type) != 0);
951  minimal_seq.append(type_object_map_[pos->type].minimal);
952  complete_seq.append(type_object_map_[pos->type].complete);
953  }
954 
955  // Compute the final type identifiers with the correct hash value.
957  size_t minimal_size = serialized_size(encoding, minimal_seq);
958  ACE_Message_Block minimal_buff(minimal_size);
959  OpenDDS::DCPS::Serializer minimal_ser(&minimal_buff, encoding);
960  if (!(minimal_ser << minimal_seq)) {
961  be_util::misc_error_and_abort("Failed to serialize minimal type object sequence in strongly-connected component", type);
962  }
963 
964  unsigned char result[sizeof(OpenDDS::DCPS::MD5Result)];
965  OpenDDS::DCPS::MD5Hash(result, minimal_buff.rd_ptr(), minimal_buff.length());
966 
967  // First 14 bytes of MD5 of the serialized TypeObject using XCDR
968  // version 2 with Little Endian encoding
969  std::memcpy(minimal_ti.sc_component_id().sc_component_id.hash, result, sizeof(OpenDDS::XTypes::EquivalenceHash));
970 
971  size_t complete_size = serialized_size(encoding, complete_seq);
972  ACE_Message_Block complete_buff(complete_size);
973  OpenDDS::DCPS::Serializer complete_ser(&complete_buff, encoding);
974  if (!(complete_ser << complete_seq)) {
975  be_util::misc_error_and_abort("Failed to serialize complete type object sequence in strongly-connected component", type);
976  }
977 
978  OpenDDS::DCPS::MD5Hash(result, complete_buff.rd_ptr(), complete_buff.length());
979  std::memcpy(complete_ti.sc_component_id().sc_component_id.hash, result, sizeof(OpenDDS::XTypes::EquivalenceHash));
980 
981  {
982  size_t idx = 0;
983  for (List::const_iterator pos = scc.begin(); pos != scc.end(); ++pos) {
984  minimal_ti.sc_component_id().scc_index = static_cast<int>(++idx);
985  complete_ti.sc_component_id().scc_index = minimal_ti.sc_component_id().scc_index;
986  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
987  hash_type_identifier_map_[pos->type] = ti_pair;
988  }
989  }
990 
991  // Compute the final type objects with the final type identifiers.
992  for (List::const_iterator pos = scc.begin(); pos != scc.end(); ++pos) {
993  generate_type_identifier(pos->type, true);
994  const OpenDDS::XTypes::TypeIdentifier& minimal_ti = hash_type_identifier_map_[pos->type].minimal;
995  const OpenDDS::XTypes::TypeIdentifier& complete_ti = hash_type_identifier_map_[pos->type].complete;
996  minimal_type_map_[minimal_ti] = type_object_map_[pos->type].minimal;
997  complete_type_map_[complete_ti] = type_object_map_[pos->type].complete;
998  }
999  }
1000  }
1001 }
OpenDDS::XTypes::TypeMap complete_type_map_
Class to serialize and deserialize data for DDS.
Definition: Serializer.h:355
std::map< AST_Type *, Element > element_
ACE_CDR::Octet kind() const
Definition: TypeObject.h:667
AutoidKind
Definition: annotations.h:217
void misc_error_and_abort(const std::string &message, AST_Decl *node=0)
Report a miscellaneous error and abort.
void consider(Element &v, AST_Type *type, const std::string &anonymous_name)
unsigned char MD5Result[16]
Definition: Hash.h:21
TypeObjectMap type_object_map_
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:134
BE_GlobalData * be_global
Definition: be_global.cpp:43
const TypeIdentifierKind TI_STRONGLY_CONNECTED_COMPONENT
Definition: TypeObject.h:198
void generate_type_identifier(AST_Type *type, bool force_type_object)
ACE_CDR::ULong MemberId
Definition: TypeObject.h:829
HashTypeIdentifierMap hash_type_identifier_map_
ACE_CDR::Octet EquivalenceHash[14]
Definition: TypeObject.h:216
const Encoding & get_typeobject_encoding()
Definition: TypeObject.cpp:27
void MD5Hash(MD5Result &result, const void *input, size_t size)
Definition: Hash.cpp:323
OpenDDS::XTypes::TypeMap minimal_type_map_
String to_dds_string(unsigned short to_convert)
void serialized_size(const Encoding &encoding, size_t &size, const XTypes::TypeLookup_getTypes_In &stru)
Definition: TypeLookup.cpp:15
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:66
Sequence & append(const T &member)
Definition: TypeObject.h:86
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:135
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)

◆ tag_type()

string typeobject_generator::tag_type ( UTL_ScopedName *  name)
static

Definition at line 691 of file typeobject_generator.cpp.

References dds_generator::get_xtag_name().

Referenced by typeobject_generator().

692 {
694 }
const char *const name
Definition: debug.cpp:60
static std::string get_xtag_name(UTL_ScopedName *name)

◆ update_maps()

void typeobject_generator::update_maps ( AST_Type *  type,
const OpenDDS::XTypes::TypeObject minimal_to,
const OpenDDS::XTypes::TypeObject complete_to 
)
private

Definition at line 1004 of file typeobject_generator.cpp.

References OpenDDS::XTypes::makeTypeIdentifier().

Referenced by typeobject_generator::Element::operator<().

1007 {
1008  const TypeObjectPair to_pair = {minimal_to, complete_to};
1009  type_object_map_[type] = to_pair;
1010 
1011  // In case of SCC, type identifiers of the types in SCC are computed first and
1012  // type objects are constructed using them. In that case, we don't want to update
1013  // each individual type's type identifier by hashing the corresponding type object.
1014  // On the other hand, type identifier is computed if the type is not part of a SCC.
1015  if (hash_type_identifier_map_.count(type) == 0) {
1017  const OpenDDS::XTypes::TypeIdentifier complete_ti = makeTypeIdentifier(complete_to, typeid_encoding_);
1018  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1019  hash_type_identifier_map_[type] = ti_pair;
1020 
1021  minimal_type_map_[minimal_ti] = minimal_to;
1022  complete_type_map_[complete_ti] = complete_to;
1023  }
1024 }
OpenDDS::XTypes::TypeMap complete_type_map_
OpenDDS::DCPS::Encoding * typeid_encoding_
TypeIdentifier makeTypeIdentifier(const TypeObject &type_object, const DCPS::Encoding *encoding_option)
Definition: TypeObject.cpp:254
TypeObjectMap type_object_map_
HashTypeIdentifierMap hash_type_identifier_map_
OpenDDS::XTypes::TypeMap minimal_type_map_

◆ use_old_typeobject_encoding()

void typeobject_generator::use_old_typeobject_encoding ( )

Member Data Documentation

◆ complete_type_map_

OpenDDS::XTypes::TypeMap typeobject_generator::complete_type_map_
private

Definition at line 113 of file typeobject_generator.h.

◆ element_

std::map<AST_Type*, Element> typeobject_generator::element_
private

Definition at line 120 of file typeobject_generator.h.

◆ fully_desc_type_identifier_map_

FullyDescriptiveTypeIdentifierMap typeobject_generator::fully_desc_type_identifier_map_
private

Definition at line 110 of file typeobject_generator.h.

◆ get_type_map_declared_

bool typeobject_generator::get_type_map_declared_
private

Definition at line 121 of file typeobject_generator.h.

◆ hash_type_identifier_map_

HashTypeIdentifierMap typeobject_generator::hash_type_identifier_map_
private

Definition at line 107 of file typeobject_generator.h.

◆ index_

size_t typeobject_generator::index_
private

Definition at line 117 of file typeobject_generator.h.

◆ minimal_type_map_

OpenDDS::XTypes::TypeMap typeobject_generator::minimal_type_map_
private

Definition at line 112 of file typeobject_generator.h.

◆ produce_output_

bool typeobject_generator::produce_output_
private

Definition at line 115 of file typeobject_generator.h.

Referenced by produce_output().

◆ produce_xtypes_complete_

bool typeobject_generator::produce_xtypes_complete_
private

Definition at line 116 of file typeobject_generator.h.

Referenced by produce_xtypes_complete().

◆ stack_

Stack typeobject_generator::stack_
private

Definition at line 119 of file typeobject_generator.h.

◆ type_object_map_

TypeObjectMap typeobject_generator::type_object_map_
private

Definition at line 98 of file typeobject_generator.h.

◆ typeid_encoding_

OpenDDS::DCPS::Encoding* typeobject_generator::typeid_encoding_
private

Definition at line 122 of file typeobject_generator.h.


The documentation for this class was generated from the following files: