315 lines
9.8 KiB
C
315 lines
9.8 KiB
C
/*
|
|
* Copyright(c) 2006 to 2022 ZettaScale Technology and others
|
|
*
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
* http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
|
|
* v. 1.0 which is available at
|
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
|
*
|
|
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
|
|
*/
|
|
#ifndef DDSI_XT_IMPL_H
|
|
#define DDSI_XT_IMPL_H
|
|
|
|
#include "dds/features.h"
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include "dds/ddsrt/avl.h"
|
|
#include "dds/ddsrt/misc.h"
|
|
#include "dds/ddsi/ddsi_xt_typeinfo.h"
|
|
#include "dds/ddsi/ddsi_xt_typemap.h"
|
|
|
|
#if defined (__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define PTYPEIDFMT "[%s %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x]"
|
|
#define PHASH(x, n) ((x)._d == DDS_XTypes_EK_MINIMAL || (x)._d == DDS_XTypes_EK_COMPLETE ? (x)._u.equivalence_hash[(n)] : 0)
|
|
#define PTYPEID(x) (ddsi_typekind_descr((x)._d)), PHASH((x), 0), PHASH(x, 1), PHASH((x), 2), PHASH((x), 3), PHASH((x), 4), PHASH((x), 5), PHASH((x), 6), PHASH((x), 7), PHASH((x), 8), PHASH((x), 9), PHASH((x), 10), PHASH((x), 11), PHASH((x), 12), PHASH((x), 13)
|
|
|
|
#define NOARG
|
|
DDSI_LIST_TYPES_TMPL(ddsi_type_proxy_guid_list, ddsi_guid_t, NOARG, 32)
|
|
#undef NOARG
|
|
|
|
struct ddsi_typeid {
|
|
struct DDS_XTypes_TypeIdentifier x;
|
|
};
|
|
|
|
struct ddsi_typeobj {
|
|
struct DDS_XTypes_TypeObject x;
|
|
};
|
|
|
|
struct ddsi_typeinfo {
|
|
struct DDS_XTypes_TypeInformation x;
|
|
};
|
|
|
|
struct ddsi_typemap {
|
|
struct DDS_XTypes_TypeMapping x;
|
|
};
|
|
|
|
struct xt_applied_type_annotations {
|
|
struct DDS_XTypes_AppliedBuiltinTypeAnnotations *ann_builtin;
|
|
struct DDS_XTypes_AppliedAnnotationSeq *ann_custom;
|
|
};
|
|
|
|
struct xt_applied_member_annotations {
|
|
struct DDS_XTypes_AppliedBuiltinMemberAnnotations *ann_builtin;
|
|
struct DDS_XTypes_AppliedAnnotationSeq *ann_custom;
|
|
};
|
|
|
|
struct xt_type_detail {
|
|
DDS_XTypes_QualifiedTypeName type_name;
|
|
struct xt_applied_type_annotations annotations;
|
|
};
|
|
|
|
struct xt_member_detail {
|
|
DDS_XTypes_MemberName name;
|
|
DDS_XTypes_NameHash name_hash;
|
|
struct xt_applied_member_annotations annotations;
|
|
};
|
|
|
|
struct xt_string {
|
|
DDS_XTypes_LBound bound;
|
|
};
|
|
|
|
struct xt_collection_common {
|
|
DDS_XTypes_CollectionTypeFlag flags;
|
|
DDS_XTypes_EquivalenceKind ek;
|
|
struct xt_type_detail detail;
|
|
struct ddsi_type *element_type;
|
|
DDS_XTypes_CollectionElementFlag element_flags;
|
|
struct xt_applied_member_annotations element_annotations;
|
|
};
|
|
|
|
struct xt_seq {
|
|
struct xt_collection_common c;
|
|
DDS_XTypes_LBound bound;
|
|
};
|
|
|
|
struct xt_array {
|
|
struct xt_collection_common c;
|
|
struct DDS_XTypes_LBoundSeq bounds;
|
|
};
|
|
|
|
struct xt_map {
|
|
struct xt_collection_common c;
|
|
DDS_XTypes_LBound bound;
|
|
DDS_XTypes_CollectionElementFlag key_flags;
|
|
struct ddsi_type *key_type;
|
|
struct xt_applied_member_annotations key_annotations;
|
|
};
|
|
|
|
struct xt_alias {
|
|
struct ddsi_type *related_type;
|
|
DDS_XTypes_AliasTypeFlag flags;
|
|
DDS_XTypes_AliasMemberFlag related_flags;
|
|
struct xt_type_detail detail;
|
|
};
|
|
|
|
struct xt_annotation_parameter {
|
|
struct ddsi_type *member_type;
|
|
DDS_XTypes_AnnotationParameterFlag flags;
|
|
DDS_XTypes_MemberName name;
|
|
DDS_XTypes_NameHash name_hash;
|
|
struct DDS_XTypes_AnnotationParameterValue default_value;
|
|
};
|
|
struct xt_annotation_parameter_seq {
|
|
uint32_t length;
|
|
struct xt_annotation_parameter *seq;
|
|
};
|
|
struct xt_annotation {
|
|
DDS_XTypes_QualifiedTypeName annotation_name;
|
|
struct xt_annotation_parameter_seq *members;
|
|
};
|
|
|
|
struct xt_struct_member {
|
|
DDS_XTypes_MemberId id;
|
|
DDS_XTypes_StructMemberFlag flags;
|
|
struct ddsi_type *type;
|
|
struct xt_member_detail detail;
|
|
};
|
|
struct xt_struct_member_seq {
|
|
uint32_t length;
|
|
struct xt_struct_member *seq;
|
|
};
|
|
struct xt_struct {
|
|
DDS_XTypes_StructTypeFlag flags;
|
|
struct ddsi_type *base_type;
|
|
struct xt_struct_member_seq members;
|
|
struct xt_type_detail detail;
|
|
};
|
|
|
|
struct xt_union_member {
|
|
DDS_XTypes_MemberId id;
|
|
DDS_XTypes_UnionMemberFlag flags;
|
|
struct ddsi_type *type;
|
|
struct DDS_XTypes_UnionCaseLabelSeq label_seq;
|
|
struct xt_member_detail detail;
|
|
};
|
|
struct xt_union_member_seq {
|
|
uint32_t length;
|
|
struct xt_union_member *seq;
|
|
};
|
|
struct xt_union {
|
|
DDS_XTypes_UnionTypeFlag flags;
|
|
struct ddsi_type *disc_type;
|
|
DDS_XTypes_UnionDiscriminatorFlag disc_flags;
|
|
struct xt_applied_type_annotations disc_annotations;
|
|
struct xt_union_member_seq members;
|
|
struct xt_type_detail detail;
|
|
};
|
|
|
|
struct xt_bitfield {
|
|
uint16_t position;
|
|
DDS_XTypes_BitsetMemberFlag flags;
|
|
uint8_t bitcount;
|
|
DDS_XTypes_TypeKind holder_type; // Must be primitive integer type
|
|
struct xt_member_detail detail;
|
|
};
|
|
struct xt_bitfield_seq {
|
|
uint32_t length;
|
|
struct xt_bitfield *seq;
|
|
};
|
|
struct xt_bitset {
|
|
DDS_XTypes_BitsetTypeFlag flags;
|
|
struct xt_bitfield_seq fields;
|
|
struct xt_type_detail detail;
|
|
};
|
|
|
|
struct xt_enum_literal {
|
|
int32_t value;
|
|
DDS_XTypes_EnumeratedLiteralFlag flags;
|
|
struct xt_member_detail detail;
|
|
};
|
|
struct xt_enum_literal_seq {
|
|
uint32_t length;
|
|
struct xt_enum_literal *seq;
|
|
};
|
|
struct xt_enum {
|
|
DDS_XTypes_EnumTypeFlag flags;
|
|
DDS_XTypes_BitBound bit_bound;
|
|
struct xt_enum_literal_seq literals;
|
|
struct xt_type_detail detail;
|
|
};
|
|
|
|
struct xt_bitflag {
|
|
uint16_t position;
|
|
DDS_XTypes_BitflagFlag flags;
|
|
struct xt_member_detail detail;
|
|
};
|
|
struct xt_bitflag_seq {
|
|
uint32_t length;
|
|
struct xt_bitflag *seq;
|
|
};
|
|
struct xt_bitmask {
|
|
DDS_XTypes_BitmaskTypeFlag flags;
|
|
DDS_XTypes_BitBound bit_bound;
|
|
struct xt_bitflag_seq bitflags;
|
|
struct xt_type_detail detail;
|
|
};
|
|
|
|
struct xt_type
|
|
{
|
|
ddsi_typeid_t id;
|
|
ddsi_typeid_kind_t kind;
|
|
struct DDS_XTypes_StronglyConnectedComponentId sc_component_id;
|
|
|
|
uint8_t _d;
|
|
union {
|
|
// case TK_NONE:
|
|
// case TK_BOOLEAN:
|
|
// case TK_BYTE:
|
|
// case TK_INT16:
|
|
// case TK_INT32:
|
|
// case TK_INT64:
|
|
// case TK_UINT8:
|
|
// case TK_UINT16:
|
|
// case TK_UINT32:
|
|
// case TK_UINT64:
|
|
// case TK_FLOAT32:
|
|
// case TK_FLOAT64:
|
|
// case TK_FLOAT128:
|
|
// case TK_CHAR8:
|
|
// case TK_CHAR16:
|
|
// <empty for primitive types>
|
|
// case TK_STRING8:
|
|
struct xt_string str8;
|
|
// case TK_STRING16:
|
|
struct xt_string str16;
|
|
// case TK_SEQUENCE:
|
|
struct xt_seq seq;
|
|
// case TK_ARRAY:
|
|
struct xt_array array;
|
|
// case TK_MAP:
|
|
struct xt_map map;
|
|
// case TK_ALIAS:
|
|
struct xt_alias alias;
|
|
// case TK_ANNOTATION:
|
|
struct xt_annotation annotation;
|
|
// case TK_STRUCTURE:
|
|
struct xt_struct structure;
|
|
// case TK_UNION:
|
|
struct xt_union union_type;
|
|
// case TK_BITSET:
|
|
struct xt_bitset bitset;
|
|
// case TK_ENUM:
|
|
struct xt_enum enum_type;
|
|
// case TK_BITMASK:
|
|
struct xt_bitmask bitmask;
|
|
} _u;
|
|
};
|
|
|
|
/* Type identifier must at offset 0, see comment for ddsi_type */
|
|
DDSRT_STATIC_ASSERT (offsetof (struct xt_type, id) == 0);
|
|
|
|
struct ddsi_type_dep {
|
|
ddsrt_avl_node_t src_avl_node;
|
|
ddsrt_avl_node_t dep_avl_node;
|
|
ddsi_typeid_t src_type_id; // type that has the dependency on dep_type_id
|
|
ddsi_typeid_t dep_type_id; // dependent type, a direct or indirect dependency of src_type_id
|
|
bool from_type_info; // entry was added based on a dependent type in the type-info, requires unref of the dependent type on deletion
|
|
};
|
|
|
|
struct ddsi_type {
|
|
struct xt_type xt; /* wrapper for XTypes type id/obj */
|
|
ddsrt_avl_node_t avl_node;
|
|
enum ddsi_type_state state;
|
|
seqno_t request_seqno; /* sequence number of the last type lookup request message */
|
|
struct ddsi_type_proxy_guid_list proxy_guids; /* administration for proxy endpoints (not proxy topics) that are using this type */
|
|
uint32_t refc; /* refcount for this record */
|
|
};
|
|
|
|
/* The xt_type member must be at offset 0 so that the type identifier field
|
|
in this type is at offset 0, and a ddsi_type can be used for hash table lookup
|
|
without copying the type identifier in the search template */
|
|
DDSRT_STATIC_ASSERT (offsetof (struct ddsi_type, xt) == 0);
|
|
|
|
DDS_EXPORT char *ddsi_make_typeid_str_impl (struct ddsi_typeid_str *buf, const DDS_XTypes_TypeIdentifier *type_id);
|
|
DDS_EXPORT int ddsi_typeid_compare_impl (const struct DDS_XTypes_TypeIdentifier *a, const struct DDS_XTypes_TypeIdentifier *b);
|
|
DDS_EXPORT void ddsi_typeid_fini_impl (struct DDS_XTypes_TypeIdentifier *type_id);
|
|
|
|
DDS_EXPORT void ddsi_typeid_copy_impl (struct DDS_XTypes_TypeIdentifier *dst, const struct DDS_XTypes_TypeIdentifier *src);
|
|
DDS_EXPORT void ddsi_typeid_copy_to_impl (struct DDS_XTypes_TypeIdentifier *dst, const ddsi_typeid_t *src);
|
|
DDS_EXPORT struct DDS_XTypes_TypeIdentifier * ddsi_typeid_dup_impl (const struct DDS_XTypes_TypeIdentifier *src);
|
|
DDS_EXPORT ddsi_typeid_t * ddsi_typeid_dup_from_impl (const struct DDS_XTypes_TypeIdentifier *src);
|
|
DDS_EXPORT bool ddsi_typeid_is_none_impl (const struct DDS_XTypes_TypeIdentifier *type_id);
|
|
|
|
DDS_EXPORT void ddsi_xt_get_typeobject_impl (const struct xt_type *xt, struct DDS_XTypes_TypeObject *to);
|
|
DDS_EXPORT dds_return_t ddsi_type_ref_id_locked_impl (struct ddsi_domaingv *gv, struct ddsi_type **type, const struct DDS_XTypes_TypeIdentifier *type_id);
|
|
DDS_EXPORT struct ddsi_type * ddsi_type_lookup_locked_impl (struct ddsi_domaingv *gv, const struct DDS_XTypes_TypeIdentifier *type_id);
|
|
DDS_EXPORT const struct DDS_XTypes_TypeObject * ddsi_typemap_typeobj (const ddsi_typemap_t *tmap, const struct DDS_XTypes_TypeIdentifier *type_id);
|
|
|
|
DDS_EXPORT bool ddsi_typeid_is_hash_impl (const struct DDS_XTypes_TypeIdentifier *type_id);
|
|
DDS_EXPORT bool ddsi_typeid_is_minimal_impl (const struct DDS_XTypes_TypeIdentifier *type_id);
|
|
DDS_EXPORT bool ddsi_typeid_is_complete_impl (const struct DDS_XTypes_TypeIdentifier *type_id);
|
|
DDS_EXPORT void ddsi_typeobj_fini_impl (struct DDS_XTypes_TypeObject *typeobj);
|
|
DDS_EXPORT dds_return_t ddsi_xt_type_init_impl (struct ddsi_domaingv *gv, struct xt_type *xt, const struct DDS_XTypes_TypeIdentifier *ti, const struct DDS_XTypes_TypeObject *to);
|
|
|
|
#if defined (__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif /* DDSI_XT_IMPL_H */
|