OpenDDS  Snapshot(2023/04/07-19:43)
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 715 of file typeobject_generator.cpp.

References typeobject_generator::Element::lowlink.

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

716 {
717  switch (type->node_type()) {
718  case AST_ConcreteType::NT_union_fwd:
719  {
720  AST_UnionFwd* const n = dynamic_cast<AST_UnionFwd*>(type);
721  type = n->full_definition();
722  break;
723  }
724  case AST_ConcreteType::NT_struct_fwd:
725  {
726  AST_StructureFwd* const n = dynamic_cast<AST_StructureFwd*>(type);
727  type = n->full_definition();
728  break;
729  }
730  default:
731  break;
732  }
733 
734  if (element_.find(type) == element_.end()) {
735  strong_connect(type, anonymous_name);
736  v.lowlink = std::min(v.lowlink, element_[type].lowlink);
737  } else if (element_[type].on_stack) {
738  v.lowlink = std::min(v.lowlink, element_[type].index);
739  }
740 }
void strong_connect(AST_Type *type, const std::string &anonymous_name)
std::map< AST_Type *, Element > element_

◆ declare_get_type_map()

void typeobject_generator::declare_get_type_map ( )
private

Definition at line 548 of file typeobject_generator.cpp.

References be_global.

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

549 {
551  return;
552  }
553  get_type_map_declared_ = true;
554 
555  be_global->add_include("dds/DCPS/XTypes/TypeObject.h", BE_GlobalData::STREAM_H);
556 
557  be_global->impl_ << "static const XTypes::TypeMap& get_minimal_type_map();\n";
558 
560  be_global->impl_ << "static const XTypes::TypeMap& get_complete_type_map();\n";
561  }
562 }
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 686 of file typeobject_generator.cpp.

References java_ts_generator::generate().

Referenced by typeobject_generator().

688 {
689  return generate(node, name);
690 }
bool generate(AST_Type *node, UTL_ScopedName *name)
const char *const name
Definition: debug.cpp:60

◆ gen_epilogue()

void typeobject_generator::gen_epilogue ( )
virtual

Reimplemented from dds_generator.

Definition at line 573 of file typeobject_generator.cpp.

References be_global.

Referenced by typeobject_generator().

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

◆ 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 693 of file typeobject_generator.cpp.

References java_ts_generator::generate().

Referenced by typeobject_generator().

695 {
696  return generate(node, name);
697 }
bool generate(AST_Type *node, UTL_ScopedName *name)
const char *const name
Definition: debug.cpp:60

◆ 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 700 of file typeobject_generator.cpp.

References java_ts_generator::generate().

Referenced by typeobject_generator().

702 {
703  return generate(node, name);
704 }
bool generate(AST_Type *node, UTL_ScopedName *name)
const char *const name
Definition: debug.cpp:60

◆ 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 707 of file typeobject_generator.cpp.

References java_ts_generator::generate().

Referenced by typeobject_generator().

710 {
711  return generate(node, name);
712 }
bool generate(AST_Type *node, UTL_ScopedName *name)
const char *const name
Definition: debug.cpp:60

◆ generate()

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

Definition at line 1700 of file typeobject_generator.cpp.

References be_global, and Function::endArgs().

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

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

◆ generate_alias_type_identifier()

void typeobject_generator::generate_alias_type_identifier ( AST_Type *  type)
private

Definition at line 1435 of file typeobject_generator.cpp.

References OpenDDS::XTypes::CompleteTypeObject::alias_type, OpenDDS::XTypes::MinimalTypeObject::alias_type, OpenDDS::XTypes::CompleteAliasType::body, OpenDDS::XTypes::MinimalAliasType::body, canonical_name(), 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<().

1436 {
1437  AST_Typedef* const n = dynamic_cast<AST_Typedef*>(type);
1438 
1439  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1440  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1441  minimal_to.minimal.kind = OpenDDS::XTypes::TK_ALIAS;
1443 
1444  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1445  complete_to.complete.kind = OpenDDS::XTypes::TK_ALIAS;
1446  complete_to.complete.alias_type.header.detail.type_name = canonical_name(type->name());
1448 
1449  update_maps(type, minimal_to, complete_to);
1450 }
CompleteTypeObject complete
Definition: TypeObject.h:3243
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:205
const TypeKind TK_ALIAS
Definition: TypeObject.h:235
std::string canonical_name(UTL_ScopedName *sn)
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
MinimalTypeObject minimal
Definition: TypeObject.h:3244
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:206

◆ generate_array_type_identifier()

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

Definition at line 1266 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, canonical_name(), 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<().

1267 {
1268  AST_Array* const n = dynamic_cast<AST_Array*>(type);
1269 
1270  const TryConstructFailAction trycon = be_global->try_construct(n->base_type());
1271  OpenDDS::XTypes::CollectionElementFlag cef = try_construct_to_member_flag(trycon);
1272  if (be_global->is_external(n->base_type())) {
1274  }
1275  const OpenDDS::XTypes::TypeIdentifier minimal_elem_ti = get_minimal_type_identifier(n->base_type());
1276  const OpenDDS::XTypes::TypeIdentifier complete_elem_ti = get_complete_type_identifier(n->base_type());
1277 
1278  if (be_global->is_plain(type) && !force_type_object) {
1279  const OpenDDS::XTypes::EquivalenceKind minimal_ek =
1281  const OpenDDS::XTypes::EquivalenceKind complete_ek =
1282  minimal_ek == OpenDDS::XTypes::EK_BOTH ? minimal_ek : OpenDDS::XTypes::EK_COMPLETE;
1283 
1284  ACE_CDR::ULong max_bound = 0;
1285  for (ACE_CDR::ULong dim = 0; dim != n->n_dims(); ++dim) {
1286  max_bound = std::max(max_bound, n->dims()[dim]->ev()->u.ulval);
1287  }
1288 
1289  if (max_bound < 256) {
1291  minimal_ti.array_sdefn().header.equiv_kind = minimal_ek;
1292  minimal_ti.array_sdefn().header.element_flags = cef;
1293  for (ACE_CDR::ULong dim = 0; dim != n->n_dims(); ++dim) {
1294  minimal_ti.array_sdefn().array_bound_seq.append(n->dims()[dim]->ev()->u.ulval);
1295  }
1296  minimal_ti.array_sdefn().element_identifier = minimal_elem_ti;
1297 
1298  if (minimal_ek == OpenDDS::XTypes::EK_BOTH) {
1299  fully_desc_type_identifier_map_[type] = minimal_ti;
1300  } else {
1302  complete_ti.array_sdefn().header.equiv_kind = complete_ek;
1303  complete_ti.array_sdefn().header.element_flags = cef;
1304  complete_ti.array_sdefn().array_bound_seq = minimal_ti.array_sdefn().array_bound_seq;
1305  complete_ti.array_sdefn().element_identifier = complete_elem_ti;
1306 
1307  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1308  hash_type_identifier_map_[type] = ti_pair;
1309  }
1310  } else {
1312  minimal_ti.array_ldefn().header.equiv_kind = minimal_ek;
1313  minimal_ti.array_ldefn().header.element_flags = cef;
1314  for (ACE_CDR::ULong dim = 0; dim != n->n_dims(); ++dim) {
1315  minimal_ti.array_ldefn().array_bound_seq.append(n->dims()[dim]->ev()->u.ulval);
1316  }
1317  minimal_ti.array_ldefn().element_identifier = minimal_elem_ti;
1318 
1319  if (minimal_ek == OpenDDS::XTypes::EK_BOTH) {
1320  fully_desc_type_identifier_map_[type] = minimal_ti;
1321  } else {
1323  complete_ti.array_ldefn().header.equiv_kind = complete_ek;
1324  complete_ti.array_ldefn().header.element_flags = cef;
1325  complete_ti.array_ldefn().array_bound_seq = minimal_ti.array_ldefn().array_bound_seq;
1326  complete_ti.array_ldefn().element_identifier = complete_elem_ti;
1327 
1328  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1329  hash_type_identifier_map_[type] = ti_pair;
1330  }
1331  }
1332  } else {
1333  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1334  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1335  minimal_to.minimal.kind = OpenDDS::XTypes::TK_ARRAY;
1336  for (ACE_CDR::ULong dim = 0; dim != n->n_dims(); ++dim) {
1337  minimal_to.minimal.array_type.header.common.bound_seq.append(n->dims()[dim]->ev()->u.ulval);
1338  }
1339  minimal_to.minimal.array_type.element.common.element_flags = cef;
1340  minimal_to.minimal.array_type.element.common.type = minimal_elem_ti;
1341 
1342  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1343  complete_to.complete.kind = OpenDDS::XTypes::TK_ARRAY;
1345  complete_to.complete.array_type.header.detail.type_name = canonical_name(type->name());
1346 
1347  complete_to.complete.array_type.element.common.element_flags = cef;
1348  complete_to.complete.array_type.element.common.type = complete_elem_ti;
1349 
1350  update_maps(type, minimal_to, complete_to);
1351  }
1352 }
CompleteTypeObject complete
Definition: TypeObject.h:3243
const EquivalenceKind EK_BOTH
Definition: TypeObject.h:207
MemberFlag CollectionElementFlag
Definition: TypeObject.h:378
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:205
const TypeIdentifierKind TI_PLAIN_ARRAY_LARGE
Definition: TypeObject.h:264
MinimalCollectionElement element
Definition: TypeObject.h:2407
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
std::string canonical_name(UTL_ScopedName *sn)
const TypeIdentifierKind TI_PLAIN_ARRAY_SMALL
Definition: TypeObject.h:263
Sequence & append(const T &member)
Definition: TypeObject.h:155
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
bool is_fully_descriptive(const TypeIdentifier &ti)
Definition: TypeObject.cpp:408
HashTypeIdentifierMap hash_type_identifier_map_
const MemberFlag IS_EXTERNAL
Definition: TypeObject.h:371
ACE_UINT32 ULong
MinimalTypeObject minimal
Definition: TypeObject.h:3244
ACE_CDR::Octet EquivalenceKind
Definition: TypeObject.h:204
TryConstructFailAction
Definition: annotations.h:316
BE_GlobalData * be_global
Definition: be_global.cpp:43
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)
CompleteCollectionElement element
Definition: TypeObject.h:2377
const TypeKind TK_ARRAY
Definition: TypeObject.h:249
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:206

◆ generate_enum_type_identifier()

void typeobject_generator::generate_enum_type_identifier ( AST_Type *  type)
private

Definition at line 1208 of file typeobject_generator.cpp.

References OpenDDS::XTypes::Sequence< T >::append(), be_global, OpenDDS::XTypes::CommonEnumeratedHeader::bit_bound, canonical_name(), 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<().

1209 {
1210  AST_Enum* const n = dynamic_cast<AST_Enum*>(type);
1211  std::vector<AST_EnumVal*> contents;
1212  scope2vector(contents, n, AST_Decl::NT_enum_val);
1213  bool has_extensibility_annotation = false;
1214  const ExtensibilityKind ek = be_global->extensibility(type, extensibilitykind_appendable, has_extensibility_annotation);
1215 
1216  if (ek == extensibilitykind_mutable) {
1217  be_util::misc_error_and_abort("MUTABLE extensibility for enum is not allowed", type);
1218  }
1219 
1220  size_t default_literal_idx = 0;
1221  for (size_t i = 0; i != contents.size(); ++i) {
1222  if (contents[i]->annotations().find("@default_literal")) {
1223  default_literal_idx = i;
1224  break;
1225  }
1226  }
1227 
1228  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1229  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1230  minimal_to.minimal.kind = OpenDDS::XTypes::TK_ENUM;
1231  if (has_extensibility_annotation || !be_global->default_enum_extensibility_zero()) {
1232  minimal_to.minimal.enumerated_type.enum_flags = extensibility_to_type_flag(ek);
1233  }
1234  // TODO: Add support for @bit_bound.
1235  minimal_to.minimal.enumerated_type.header.common.bit_bound = 32;
1236 
1237  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1238  complete_to.complete.kind = OpenDDS::XTypes::TK_ENUM;
1239  if (has_extensibility_annotation || !be_global->default_enum_extensibility_zero()) {
1240  complete_to.complete.enumerated_type.enum_flags = extensibility_to_type_flag(ek);
1241  }
1242  complete_to.complete.enumerated_type.header.common.bit_bound = 32;
1243  complete_to.complete.enumerated_type.header.detail.type_name = canonical_name(type->name());
1244 
1245  for (size_t i = 0; i != contents.size(); ++i) {
1247  minimal_lit.common.value = contents[i]->constant_value()->ev()->u.eval;
1248  minimal_lit.common.flags = (i == default_literal_idx ? OpenDDS::XTypes::IS_DEFAULT : 0);
1249  const std::string name = canonical_name(contents[i]->local_name());
1251  minimal_to.minimal.enumerated_type.literal_seq.append(minimal_lit);
1252 
1254  complete_lit.common = minimal_lit.common;
1255  complete_lit.detail.name = name;
1256 
1257  complete_to.complete.enumerated_type.literal_seq.append(complete_lit);
1258  }
1259  minimal_to.minimal.enumerated_type.literal_seq.sort();
1260  complete_to.complete.enumerated_type.literal_seq.sort();
1261 
1262  update_maps(type, minimal_to, complete_to);
1263 }
void hash_member_name(NameHash &name_hash, const OPENDDS_STRING &name)
Definition: TypeObject.cpp:400
CompleteTypeObject complete
Definition: TypeObject.h:3243
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:205
ExtensibilityKind
Definition: annotations.h:278
std::string canonical_name(UTL_ScopedName *sn)
MinimalEnumeratedType enumerated_type
Definition: TypeObject.h:3135
void misc_error_and_abort(const std::string &message, AST_Decl *node=0)
Report a miscellaneous error and abort.
Sequence & append(const T &member)
Definition: TypeObject.h:155
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
const MemberFlag IS_DEFAULT
Definition: TypeObject.h:376
CompleteEnumeratedLiteralSeq literal_seq
Definition: TypeObject.h:2638
void scope2vector(std::vector< T *> &v, UTL_Scope *s, AST_Decl::NodeType nt)
Definition: dds_visitor.h:141
CompleteEnumeratedHeader header
Definition: TypeObject.h:2637
const char *const name
Definition: debug.cpp:60
const TypeKind TK_ENUM
Definition: TypeObject.h:238
MinimalTypeObject minimal
Definition: TypeObject.h:3244
MinimalEnumeratedHeader header
Definition: TypeObject.h:2666
CompleteEnumeratedType enumerated_type
Definition: TypeObject.h:2985
BE_GlobalData * be_global
Definition: be_global.cpp:43
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:206
MinimalEnumeratedLiteralSeq literal_seq
Definition: TypeObject.h:2667

◆ generate_primitive_type_identifier()

void typeobject_generator::generate_primitive_type_identifier ( AST_Type *  type)
private

Definition at line 1453 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<().

1454 {
1455  AST_PredefinedType* const n = dynamic_cast<AST_PredefinedType*>(type);
1456  switch (n->pt()) {
1457  case AST_PredefinedType::PT_long:
1459  break;
1460  case AST_PredefinedType::PT_ulong:
1462  break;
1463  case AST_PredefinedType::PT_longlong:
1465  break;
1466  case AST_PredefinedType::PT_ulonglong:
1468  break;
1469  case AST_PredefinedType::PT_short:
1471  break;
1472  case AST_PredefinedType::PT_ushort:
1474  break;
1475 #if OPENDDS_HAS_EXPLICIT_INTS
1476  case AST_PredefinedType::PT_int8:
1478  break;
1479  case AST_PredefinedType::PT_uint8:
1481  break;
1482 #endif
1483  case AST_PredefinedType::PT_float:
1485  break;
1486  case AST_PredefinedType::PT_double:
1488  break;
1489  case AST_PredefinedType::PT_longdouble:
1491  break;
1492  case AST_PredefinedType::PT_char:
1494  break;
1495  case AST_PredefinedType::PT_wchar:
1497  break;
1498  case AST_PredefinedType::PT_boolean:
1500  break;
1501  case AST_PredefinedType::PT_octet:
1503  break;
1504  case AST_PredefinedType::PT_any:
1505  case AST_PredefinedType::PT_object:
1506  case AST_PredefinedType::PT_value:
1507  case AST_PredefinedType::PT_abstract:
1508  case AST_PredefinedType::PT_void:
1509  case AST_PredefinedType::PT_pseudo:
1510  be_util::misc_error_and_abort("Unexpected primitive type");
1511  }
1512 }
const TypeKind TK_INT8
Definition: TypeObject.h:225
const TypeKind TK_FLOAT128
Definition: TypeObject.h:224
const TypeKind TK_CHAR16
Definition: TypeObject.h:228
const TypeKind TK_INT32
Definition: TypeObject.h:217
const TypeKind TK_CHAR8
Definition: TypeObject.h:227
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
const TypeKind TK_UINT16
Definition: TypeObject.h:219
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:218
const TypeKind TK_UINT8
Definition: TypeObject.h:226
const TypeKind TK_FLOAT32
Definition: TypeObject.h:222
const TypeKind TK_BOOLEAN
Definition: TypeObject.h:214
const TypeKind TK_INT16
Definition: TypeObject.h:216
const TypeKind TK_FLOAT64
Definition: TypeObject.h:223
const TypeKind TK_UINT32
Definition: TypeObject.h:220
const TypeKind TK_BYTE
Definition: TypeObject.h:215
const TypeKind TK_UINT64
Definition: TypeObject.h:221

◆ generate_sequence_type_identifier()

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

Definition at line 1355 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<().

1356 {
1357  AST_Sequence* const n = dynamic_cast<AST_Sequence*>(type);
1358 
1359  ACE_CDR::ULong bound = 0;
1360  if (!n->unbounded()) {
1361  bound = n->max_size()->ev()->u.ulval;
1362  }
1363 
1364  const TryConstructFailAction trycon = be_global->try_construct(n->base_type());
1365  OpenDDS::XTypes::CollectionElementFlag cef = try_construct_to_member_flag(trycon);
1366  if (be_global->is_external(n->base_type())) {
1368  }
1369  const OpenDDS::XTypes::TypeIdentifier minimal_elem_ti = get_minimal_type_identifier(n->base_type());
1370  const OpenDDS::XTypes::TypeIdentifier complete_elem_ti = get_complete_type_identifier(n->base_type());
1371 
1372  if (be_global->is_plain(type) && !force_type_object) {
1373  const OpenDDS::XTypes::EquivalenceKind minimal_ek =
1375  const OpenDDS::XTypes::EquivalenceKind complete_ek =
1376  minimal_ek == OpenDDS::XTypes::EK_BOTH ? minimal_ek : OpenDDS::XTypes::EK_COMPLETE;
1377  if (bound < 256) {
1379  minimal_ti.seq_sdefn().header.equiv_kind = minimal_ek;
1380  minimal_ti.seq_sdefn().header.element_flags = cef;
1381  minimal_ti.seq_sdefn().bound = bound;
1382  minimal_ti.seq_sdefn().element_identifier = minimal_elem_ti;
1383 
1384  if (minimal_ek == OpenDDS::XTypes::EK_BOTH) {
1385  fully_desc_type_identifier_map_[type] = minimal_ti;
1386  } else {
1388  complete_ti.seq_sdefn().header.equiv_kind = complete_ek;
1389  complete_ti.seq_sdefn().header.element_flags = cef;
1390  complete_ti.seq_sdefn().bound = bound;
1391  complete_ti.seq_sdefn().element_identifier = complete_elem_ti;
1392 
1393  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1394  hash_type_identifier_map_[type] = ti_pair;
1395  }
1396  } else {
1398  minimal_ti.seq_ldefn().header.equiv_kind = minimal_ek;
1399  minimal_ti.seq_ldefn().header.element_flags = cef;
1400  minimal_ti.seq_ldefn().bound = bound;
1401  minimal_ti.seq_ldefn().element_identifier = minimal_elem_ti;
1402 
1403  if (minimal_ek == OpenDDS::XTypes::EK_BOTH) {
1404  fully_desc_type_identifier_map_[type] = minimal_ti;
1405  } else {
1407  complete_ti.seq_ldefn().header.equiv_kind = complete_ek;
1408  complete_ti.seq_ldefn().header.element_flags = cef;
1409  complete_ti.seq_ldefn().bound = bound;
1410  complete_ti.seq_ldefn().element_identifier = complete_elem_ti;
1411 
1412  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1413  hash_type_identifier_map_[type] = ti_pair;
1414  }
1415  }
1416  } else {
1417  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1418  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1420  minimal_to.minimal.sequence_type.header.common.bound = bound;
1422  minimal_to.minimal.sequence_type.element.common.type = minimal_elem_ti;
1423 
1424  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1426  complete_to.complete.sequence_type.header.common.bound = bound;
1428  complete_to.complete.sequence_type.element.common.type = complete_elem_ti;
1429 
1430  update_maps(type, minimal_to, complete_to);
1431  }
1432 }
CompleteTypeObject complete
Definition: TypeObject.h:3243
const EquivalenceKind EK_BOTH
Definition: TypeObject.h:207
MemberFlag CollectionElementFlag
Definition: TypeObject.h:378
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:205
const TypeIdentifierKind TI_PLAIN_SEQUENCE_LARGE
Definition: TypeObject.h:261
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
MinimalSequenceType sequence_type
Definition: TypeObject.h:3132
MinimalCollectionHeader header
Definition: TypeObject.h:2283
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
CompleteSequenceType sequence_type
Definition: TypeObject.h:2982
bool is_fully_descriptive(const TypeIdentifier &ti)
Definition: TypeObject.cpp:408
HashTypeIdentifierMap hash_type_identifier_map_
const MemberFlag IS_EXTERNAL
Definition: TypeObject.h:371
MinimalCollectionElement element
Definition: TypeObject.h:2284
ACE_UINT32 ULong
const TypeKind TK_SEQUENCE
Definition: TypeObject.h:248
CompleteCollectionHeader header
Definition: TypeObject.h:2253
MinimalTypeObject minimal
Definition: TypeObject.h:3244
ACE_CDR::Octet EquivalenceKind
Definition: TypeObject.h:204
TryConstructFailAction
Definition: annotations.h:316
BE_GlobalData * be_global
Definition: be_global.cpp:43
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)
CompleteCollectionElement element
Definition: TypeObject.h:2254
const TypeIdentifierKind TI_PLAIN_SEQUENCE_SMALL
Definition: TypeObject.h:260
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:206

◆ generate_struct_type_identifier()

void typeobject_generator::generate_struct_type_identifier ( AST_Type *  type)
private

Definition at line 1032 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(), canonical_name(), 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<().

1033 {
1034  AST_Structure* const n = dynamic_cast<AST_Structure*>(type);
1035  const Fields fields(n);
1036 
1037  const ExtensibilityKind exten = be_global->extensibility(n);
1038  const AutoidKind auto_id = be_global->autoid(n);
1039 
1040  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1041  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1043 
1044  minimal_to.minimal.struct_type.struct_flags = extensibility_to_type_flag(exten);
1045 
1046  if (be_global->is_nested(n)) {
1048  }
1049 
1050  if (auto_id == autoidkind_hash) {
1052  }
1053 
1054  // TODO: Support inheritance.
1056 
1057  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1059 
1062  complete_to.complete.struct_type.header.detail.type_name = canonical_name(type->name());
1063  // @verbatim and custom annotations are not supported.
1064 
1065  for (Fields::Iterator i = fields.begin(); i != fields.end(); ++i) {
1066  AST_Field* field = *i;
1067  const TryConstructFailAction trycon = be_global->try_construct(field);
1068 
1069  OpenDDS::XTypes::MinimalStructMember minimal_member;
1070  minimal_member.common.member_id = be_global->get_id(field);
1071  minimal_member.common.member_flags = try_construct_to_member_flag(trycon);
1072 
1073  if (be_global->is_optional(field)) {
1075  }
1076 
1077  if (be_global->is_must_understand(field)) {
1079  }
1080 
1081  if (be_global->is_key(field)) {
1082  minimal_member.common.member_flags |= OpenDDS::XTypes::IS_KEY;
1083  }
1084 
1085  if (be_global->is_external(field)) {
1087  }
1088 
1089  minimal_member.common.member_type_id = get_minimal_type_identifier(field->field_type());
1090  const std::string name = canonical_name(field->local_name());
1091  OpenDDS::XTypes::hash_member_name(minimal_member.detail.name_hash, name);
1092  minimal_to.minimal.struct_type.member_seq.append(minimal_member);
1093 
1094  OpenDDS::XTypes::CompleteStructMember complete_member;
1095  complete_member.common.member_id = minimal_member.common.member_id;
1096  complete_member.common.member_flags = minimal_member.common.member_flags;
1097  complete_member.common.member_type_id = get_complete_type_identifier(field->field_type());
1098 
1099  complete_member.detail.name = name;
1100  set_builtin_member_annotations(field, complete_member.detail.ann_builtin);
1101 
1102  complete_to.complete.struct_type.member_seq.append(complete_member);
1103  }
1104 
1105  minimal_to.minimal.struct_type.member_seq.sort();
1106  complete_to.complete.struct_type.member_seq.sort();
1107 
1108  update_maps(type, minimal_to, complete_to);
1109 }
void hash_member_name(NameHash &name_hash, const OPENDDS_STRING &name)
Definition: TypeObject.cpp:400
CompleteTypeObject complete
Definition: TypeObject.h:3243
const MemberFlag IS_OPTIONAL
Definition: TypeObject.h:373
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:205
const TypeKind TK_STRUCTURE
Definition: TypeObject.h:243
ExtensibilityKind
Definition: annotations.h:278
CompleteStructMemberSeq member_seq
Definition: TypeObject.h:1477
std::string canonical_name(UTL_ScopedName *sn)
const TypeKind TK_NONE
Definition: TypeObject.h:213
const MemberFlag IS_MUST_UNDERSTAND
Definition: TypeObject.h:374
Sequence & append(const T &member)
Definition: TypeObject.h:155
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
AutoidKind
Definition: annotations.h:217
const MemberFlag IS_EXTERNAL
Definition: TypeObject.h:371
void set_builtin_member_annotations(AST_Decl *member, OpenDDS::XTypes::Optional< OpenDDS::XTypes::AppliedBuiltinMemberAnnotations > &annotations)
const MemberFlag IS_KEY
Definition: TypeObject.h:375
Optional< AppliedBuiltinMemberAnnotations > ann_builtin
Definition: TypeObject.h:1251
const char *const name
Definition: debug.cpp:60
MinimalStructMemberSeq member_seq
Definition: TypeObject.h:1505
MinimalTypeObject minimal
Definition: TypeObject.h:3244
TryConstructFailAction
Definition: annotations.h:316
BE_GlobalData * be_global
Definition: be_global.cpp:43
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)
const TypeFlag IS_AUTOID_HASH
Definition: TypeObject.h:405
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:206
const TypeFlag IS_NESTED
Definition: TypeObject.h:404

◆ generate_type_identifier()

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

Definition at line 1515 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<().

1516 {
1517  // Generate both minimal and complete identifiers (and type objects) and cache.
1518  switch (type->node_type()) {
1519 
1520  case AST_ConcreteType::NT_union:
1521  {
1523  break;
1524  }
1525 
1526  case AST_ConcreteType::NT_struct:
1527  {
1529  break;
1530  }
1531 
1532  case AST_ConcreteType::NT_enum:
1533  {
1535  break;
1536  }
1537 
1538  case AST_ConcreteType::NT_string:
1539  {
1540  AST_String* const n = dynamic_cast<AST_String*>(type);
1541  ACE_CDR::ULong bound = n->max_size()->ev()->u.ulval;
1542  if (bound < 256) {
1544  ti.string_sdefn().bound = bound;
1546  } else {
1548  ti.string_ldefn().bound = bound;
1550  }
1551  break;
1552  }
1553 
1554  case AST_ConcreteType::NT_wstring:
1555  {
1556  AST_String* const n = dynamic_cast<AST_String*>(type);
1557  ACE_CDR::ULong bound = n->max_size()->ev()->u.ulval;
1558  if (bound < 256) {
1560  ti.string_sdefn().bound = bound;
1562  } else {
1564  ti.string_ldefn().bound = bound;
1566  }
1567  break;
1568  }
1569 
1570  case AST_ConcreteType::NT_array:
1571  {
1572  generate_array_type_identifier(type, force_type_object);
1573  break;
1574  }
1575 
1576  case AST_ConcreteType::NT_sequence:
1577  {
1578  generate_sequence_type_identifier(type, force_type_object);
1579  break;
1580  }
1581 
1582  case AST_ConcreteType::NT_typedef:
1583  {
1585  break;
1586  }
1587 
1588  case AST_ConcreteType::NT_pre_defined:
1589  {
1591  break;
1592  }
1593 
1594  case AST_ConcreteType::NT_fixed:
1595  case AST_ConcreteType::NT_interface:
1596  case AST_ConcreteType::NT_interface_fwd:
1597  {
1599  break;
1600  }
1601 
1602  case AST_ConcreteType::NT_struct_fwd:
1603  case AST_ConcreteType::NT_union_fwd:
1604  case AST_ConcreteType::NT_native:
1605  case AST_ConcreteType::NT_factory:
1606  case AST_ConcreteType::NT_finder:
1607  case AST_ConcreteType::NT_component:
1608  case AST_ConcreteType::NT_component_fwd:
1609  case AST_ConcreteType::NT_home:
1610  case AST_ConcreteType::NT_eventtype:
1611  case AST_ConcreteType::NT_eventtype_fwd:
1612  case AST_ConcreteType::NT_valuebox:
1613  case AST_ConcreteType::NT_type:
1614  case AST_ConcreteType::NT_porttype:
1615  case AST_ConcreteType::NT_provides:
1616  case AST_ConcreteType::NT_uses:
1617  case AST_ConcreteType::NT_publishes:
1618  case AST_ConcreteType::NT_emits:
1619  case AST_ConcreteType::NT_consumes:
1620  case AST_ConcreteType::NT_ext_port:
1621  case AST_ConcreteType::NT_mirror_port:
1622  case AST_ConcreteType::NT_connector:
1623  case AST_ConcreteType::NT_param_holder:
1624  case AST_ConcreteType::NT_annotation_decl:
1625  case AST_ConcreteType::NT_annotation_appl:
1626  case AST_ConcreteType::NT_annotation_member:
1627  case AST_ConcreteType::NT_module:
1628  case AST_ConcreteType::NT_root:
1629  case AST_ConcreteType::NT_valuetype:
1630  case AST_ConcreteType::NT_valuetype_fwd:
1631  case AST_ConcreteType::NT_const:
1632  case AST_ConcreteType::NT_except:
1633  case AST_ConcreteType::NT_attr:
1634  case AST_ConcreteType::NT_op:
1635  case AST_ConcreteType::NT_argument:
1636  case AST_ConcreteType::NT_union_branch:
1637  case AST_ConcreteType::NT_field:
1638  case AST_ConcreteType::NT_enum_val:
1639  be_util::misc_error_and_abort("Unexpected AST type", type);
1640  }
1641 }
void generate_union_type_identifier(AST_Type *type)
const TypeIdentifierKind TI_STRING16_LARGE
Definition: TypeObject.h:258
void generate_alias_type_identifier(AST_Type *type)
void generate_enum_type_identifier(AST_Type *type)
const TypeIdentifierKind TI_STRING8_LARGE
Definition: TypeObject.h:256
const TypeIdentifierKind TI_STRING16_SMALL
Definition: TypeObject.h:257
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
const TypeKind TK_NONE
Definition: TypeObject.h:213
void misc_error_and_abort(const std::string &message, AST_Decl *node=0)
Report a miscellaneous error and abort.
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_struct_type_identifier(AST_Type *type)
ACE_UINT32 ULong
void generate_primitive_type_identifier(AST_Type *type)
const TypeIdentifierKind TI_STRING8_SMALL
Definition: TypeObject.h:255

◆ generate_union_type_identifier()

void typeobject_generator::generate_union_type_identifier ( AST_Type *  type)
private

Definition at line 1112 of file typeobject_generator.cpp.

References OpenDDS::XTypes::CompleteMemberDetail::ann_builtin, OpenDDS::XTypes::Sequence< T >::append(), autoidkind_hash, be_global, Fields::begin(), canonical_name(), 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<().

1113 {
1114  AST_Union* const n = dynamic_cast<AST_Union*>(type);
1115  AST_Type* discriminator = n->disc_type();
1116  const Fields fields(n);
1117 
1118  const ExtensibilityKind exten = be_global->extensibility(n);
1119  const AutoidKind auto_id = be_global->autoid(n);
1120 
1121  OpenDDS::XTypes::TypeObject minimal_to, complete_to;
1122  minimal_to.kind = OpenDDS::XTypes::EK_MINIMAL;
1123  minimal_to.minimal.kind = OpenDDS::XTypes::TK_UNION;
1124  minimal_to.minimal.union_type.union_flags = extensibility_to_type_flag(exten);
1125 
1126  if (be_global->is_nested(n)) {
1128  }
1129 
1130  if (auto_id == autoidkind_hash) {
1132  }
1133 
1134  const TryConstructFailAction trycon = be_global->union_discriminator_try_construct(n);
1135  minimal_to.minimal.union_type.discriminator.common.member_flags = try_construct_to_member_flag(trycon);
1136  if (be_global->union_discriminator_is_key(n)) {
1138  }
1140 
1141  complete_to.kind = OpenDDS::XTypes::EK_COMPLETE;
1142  complete_to.complete.kind = OpenDDS::XTypes::TK_UNION;
1143  complete_to.complete.union_type.union_flags = minimal_to.minimal.union_type.union_flags;
1144 
1145  complete_to.complete.union_type.header.detail.type_name = canonical_name(type->name());
1146 
1150 
1151  for (Fields::Iterator i = fields.begin(); i != fields.end(); ++i) {
1152  AST_UnionBranch* branch = dynamic_cast<AST_UnionBranch*>(*i);
1153  const TryConstructFailAction trycon = be_global->try_construct(branch);
1154 
1155  bool is_default = false;
1156  for (unsigned long j = 0; j < branch->label_list_length(); ++j) {
1157  AST_UnionLabel* label = branch->label(j);
1158  if (label->label_kind() == AST_UnionLabel::UL_default) {
1159  is_default = true;
1160  break;
1161  }
1162  }
1163 
1164  OpenDDS::XTypes::MinimalUnionMember minimal_member;
1165  minimal_member.common.member_id = be_global->get_id(branch);
1166  minimal_member.common.member_flags = try_construct_to_member_flag(trycon);
1167 
1168  if (is_default) {
1170  }
1171 
1172  if (be_global->is_external(branch)) {
1174  }
1175 
1176  minimal_member.common.type_id = get_minimal_type_identifier(branch->field_type());
1177 
1178  for (unsigned long j = 0; j < branch->label_list_length(); ++j) {
1179  AST_UnionLabel* label = branch->label(j);
1180  if (label->label_kind() != AST_UnionLabel::UL_default) {
1181  minimal_member.common.label_seq.append(to_long(*label->label_val()->ev()));
1182  }
1183  }
1184  minimal_member.common.label_seq.sort();
1185 
1186  const std::string name = canonical_name(branch->local_name());
1187  OpenDDS::XTypes::hash_member_name(minimal_member.detail.name_hash, name);
1188  minimal_to.minimal.union_type.member_seq.append(minimal_member);
1189 
1190  OpenDDS::XTypes::CompleteUnionMember complete_member;
1191  complete_member.common.member_id = minimal_member.common.member_id;
1192  complete_member.common.member_flags = minimal_member.common.member_flags;
1193  complete_member.common.type_id = get_complete_type_identifier(branch->field_type());
1194  complete_member.common.label_seq = minimal_member.common.label_seq;
1195 
1196  complete_member.detail.name = name;
1197  set_builtin_member_annotations(branch, complete_member.detail.ann_builtin);
1198 
1199  complete_to.complete.union_type.member_seq.append(complete_member);
1200  }
1201  minimal_to.minimal.union_type.member_seq.sort();
1202  complete_to.complete.union_type.member_seq.sort();
1203 
1204  update_maps(type, minimal_to, complete_to);
1205 }
void hash_member_name(NameHash &name_hash, const OPENDDS_STRING &name)
Definition: TypeObject.cpp:400
CompleteTypeObject complete
Definition: TypeObject.h:3243
OpenDDS::XTypes::TypeIdentifier get_complete_type_identifier(AST_Type *type)
const EquivalenceKind EK_MINIMAL
Definition: TypeObject.h:205
ExtensibilityKind
Definition: annotations.h:278
std::string canonical_name(UTL_ScopedName *sn)
CompleteUnionMemberSeq member_seq
Definition: TypeObject.h:1747
Sequence & append(const T &member)
Definition: TypeObject.h:155
void update_maps(AST_Type *type, const OpenDDS::XTypes::TypeObject &minimal_to, const OpenDDS::XTypes::TypeObject &complete_to)
const MemberFlag IS_DEFAULT
Definition: TypeObject.h:376
AutoidKind
Definition: annotations.h:217
const MemberFlag IS_EXTERNAL
Definition: TypeObject.h:371
void set_builtin_member_annotations(AST_Decl *member, OpenDDS::XTypes::Optional< OpenDDS::XTypes::AppliedBuiltinMemberAnnotations > &annotations)
const MemberFlag IS_KEY
Definition: TypeObject.h:375
Optional< AppliedBuiltinMemberAnnotations > ann_builtin
Definition: TypeObject.h:1251
MinimalDiscriminatorMember discriminator
Definition: TypeObject.h:1777
const char *const name
Definition: debug.cpp:60
CompleteDiscriminatorMember discriminator
Definition: TypeObject.h:1746
MinimalTypeObject minimal
Definition: TypeObject.h:3244
TryConstructFailAction
Definition: annotations.h:316
BE_GlobalData * be_global
Definition: be_global.cpp:43
OpenDDS::XTypes::TypeIdentifier get_minimal_type_identifier(AST_Type *type)
const TypeFlag IS_AUTOID_HASH
Definition: TypeObject.h:405
const TypeKind TK_UNION
Definition: TypeObject.h:244
MinimalUnionMemberSeq member_seq
Definition: TypeObject.h:1778
const EquivalenceKind EK_COMPLETE
Definition: TypeObject.h:206
const TypeFlag IS_NESTED
Definition: TypeObject.h:404

◆ get_complete_type_identifier()

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

Definition at line 1673 of file typeobject_generator.cpp.

References OPENDDS_ASSERT.

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

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

◆ get_minimal_type_identifier()

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

Definition at line 1645 of file typeobject_generator.cpp.

References OPENDDS_ASSERT.

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

1646 {
1647  switch(type->node_type()) {
1648  case AST_Decl::NT_union_fwd:
1649  {
1650  AST_UnionFwd* const td = dynamic_cast<AST_UnionFwd*>(type);
1651  return get_minimal_type_identifier(td->full_definition());
1652  }
1653  case AST_Decl::NT_struct_fwd:
1654  {
1655  AST_StructureFwd* const td = dynamic_cast<AST_StructureFwd*>(type);
1656  return get_minimal_type_identifier(td->full_definition());
1657  }
1658  default:
1659  break;
1660  }
1661 
1662  if (fully_desc_type_identifier_map_.count(type) != 0) {
1663  return fully_desc_type_identifier_map_[type];
1664  }
1665 
1666  HashTypeIdentifierMap::const_iterator pos = hash_type_identifier_map_.find(type);
1668  return pos->second.minimal;
1669 }
#define OPENDDS_ASSERT(C)
Definition: Definitions.h:66
FullyDescriptiveTypeIdentifierMap fully_desc_type_identifier_map_
HashTypeIdentifierMap hash_type_identifier_map_
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 1015 of file typeobject_generator.cpp.

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

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

1017 {
1018  // Support only @hashid annotation for member at this time.
1019  const HashidAnnotation* hashid_ann = dynamic_cast<const HashidAnnotation*>(be_global->builtin_annotations_["::@hashid"]);
1020  std::string hash_name;
1021  if (hashid_ann->node_value_exists(member, hash_name)) {
1022  OpenDDS::XTypes::Optional<std::string> hash_id(hash_name);
1023  if (!annotations) {
1026  }
1027  annotations.value().hash_id = hash_id;
1028  }
1029 }
const LogLevel::Value value
Definition: debug.cpp:61
virtual bool node_value_exists(AST_Decl *node, T &value) const
Definition: annotations.h:117
BE_GlobalData * be_global
Definition: be_global.cpp:43

◆ strong_connect()

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

Definition at line 743 of file typeobject_generator.cpp.

References OpenDDS::XTypes::Sequence< T >::append(), be_global, Fields::begin(), canonical_name(), 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<().

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

◆ tag_type()

string typeobject_generator::tag_type ( UTL_ScopedName *  name)
static

Definition at line 680 of file typeobject_generator.cpp.

References dds_generator::get_xtag_name().

Referenced by typeobject_generator().

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

◆ 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 993 of file typeobject_generator.cpp.

References OpenDDS::XTypes::makeTypeIdentifier().

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

996 {
997  const TypeObjectPair to_pair = {minimal_to, complete_to};
998  type_object_map_[type] = to_pair;
999 
1000  // In case of SCC, type identifiers of the types in SCC are computed first and
1001  // type objects are constructed using them. In that case, we don't want to update
1002  // each individual type's type identifier by hashing the corresponding type object.
1003  // On the other hand, type identifier is computed if the type is not part of a SCC.
1004  if (hash_type_identifier_map_.count(type) == 0) {
1006  const OpenDDS::XTypes::TypeIdentifier complete_ti = makeTypeIdentifier(complete_to, typeid_encoding_);
1007  const TypeIdentifierPair ti_pair = {minimal_ti, complete_ti};
1008  hash_type_identifier_map_[type] = ti_pair;
1009 
1010  minimal_type_map_[minimal_ti] = minimal_to;
1011  complete_type_map_[complete_ti] = complete_to;
1012  }
1013 }
OpenDDS::XTypes::TypeMap complete_type_map_
OpenDDS::XTypes::TypeMap minimal_type_map_
OpenDDS::DCPS::Encoding * typeid_encoding_
HashTypeIdentifierMap hash_type_identifier_map_
TypeIdentifier makeTypeIdentifier(const TypeObject &type_object, const DCPS::Encoding *encoding_option)
Definition: TypeObject.cpp:254
TypeObjectMap type_object_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: