Type safe DataTypeID class

This commit is contained in:
Pavel Kirienko
2014-03-11 21:29:35 +04:00
parent befea376c2
commit 62ea9e2746
11 changed files with 73 additions and 46 deletions
+34 -7
View File
@@ -23,6 +23,36 @@ enum DataTypeKind
NumDataTypeKinds
};
class DataTypeID
{
uint16_t value_;
public:
enum { Max = 1023 };
DataTypeID() : value_(0xFFFF) { }
DataTypeID(uint16_t id)
: value_(id)
{
assert(isValid());
}
bool isValid() const { return value_ <= Max; }
uint16_t get() const { return value_; }
bool operator==(DataTypeID rhs) const { return value_ == rhs.value_; }
bool operator!=(DataTypeID rhs) const { return value_ != rhs.value_; }
bool operator<(DataTypeID rhs) const { return value_ < rhs.value_; }
bool operator>(DataTypeID rhs) const { return value_ > rhs.value_; }
bool operator<=(DataTypeID rhs) const { return value_ <= rhs.value_; }
bool operator>=(DataTypeID rhs) const { return value_ >= rhs.value_; }
};
/**
* CRC-64-WE
* Description: http://reveng.sourceforge.net/crc-catalogue/17plus.htm#crc.cat-bits.64
@@ -89,39 +119,36 @@ public:
class DataTypeDescriptor
{
DataTypeKind kind_;
uint16_t id_;
DataTypeID id_;
DataTypeSignature signature_;
const char* full_name_;
public:
enum { MaxDataTypeID = 1023 };
enum { MaxFullNameLen = 80 };
DataTypeDescriptor()
: kind_(DataTypeKind(0))
, id_(0)
, full_name_("")
{ }
DataTypeDescriptor(DataTypeKind kind, uint16_t id, const DataTypeSignature& signature, const char* name)
DataTypeDescriptor(DataTypeKind kind, DataTypeID id, const DataTypeSignature& signature, const char* name)
: kind_(kind)
, id_(id)
, signature_(signature)
, full_name_(name)
{
assert(id <= MaxDataTypeID);
assert(kind < NumDataTypeKinds);
assert(name);
assert(std::strlen(name) <= MaxFullNameLen);
}
DataTypeKind getKind() const { return kind_; }
uint16_t getID() const { return id_; }
DataTypeID getID() const { return id_; }
const DataTypeSignature& getSignature() const { return signature_; }
const char* getFullName() const { return full_name_; }
bool match(DataTypeKind kind, const char* name) const;
bool match(DataTypeKind kind, uint16_t id) const;
bool match(DataTypeKind kind, DataTypeID id) const;
std::string toString() const;
@@ -19,7 +19,7 @@
namespace uavcan
{
typedef std::bitset<DataTypeDescriptor::MaxDataTypeID + 1> DataTypeIDMask;
typedef std::bitset<DataTypeID::Max + 1> DataTypeIDMask;
class GlobalDataTypeRegistry : Noncopyable
{
@@ -29,14 +29,14 @@ class GlobalDataTypeRegistry : Noncopyable
Entry() { }
Entry(DataTypeKind kind, uint16_t id, const DataTypeSignature& signature, const char* name)
Entry(DataTypeKind kind, DataTypeID id, const DataTypeSignature& signature, const char* name)
: descriptor(kind, id, signature, name)
{ }
};
struct EntryInsertionComparator
{
const uint16_t id;
const DataTypeID id;
EntryInsertionComparator(Entry* dtd) : id(dtd->descriptor.getID()) { }
bool operator()(const Entry* entry) const
{
@@ -73,7 +73,7 @@ public:
/// Last call wins
template <typename Type>
RegistResult regist(uint16_t id)
RegistResult regist(DataTypeID id)
{
if (isFrozen())
return RegistResultFrozen;
@@ -26,9 +26,9 @@ class Dispatcher : Noncopyable
class DataTypeIDInsertionComparator
{
const uint16_t id_;
const DataTypeID id_;
public:
DataTypeIDInsertionComparator(uint16_t id) : id_(id) { }
DataTypeIDInsertionComparator(DataTypeID id) : id_(id) { }
bool operator()(const TransferListenerBase* listener) const
{
assert(listener);
@@ -20,7 +20,7 @@ class Frame
{
uint8_t payload_[sizeof(CanFrame::data)];
TransferType transfer_type_;
uint_fast16_t data_type_id_;
DataTypeID data_type_id_;
uint_fast8_t payload_len_;
NodeID src_node_id_;
NodeID dst_node_id_;
@@ -33,14 +33,13 @@ public:
Frame()
: transfer_type_(TransferType(NumTransferTypes)) // That is invalid value
, data_type_id_(0)
, payload_len_(0)
, frame_index_(0)
, transfer_id_(0)
, last_frame_(false)
{ }
Frame(uint_fast16_t data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
Frame(DataTypeID data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
uint_fast8_t frame_index, TransferID transfer_id, bool last_frame = false)
: transfer_type_(transfer_type)
, data_type_id_(data_type_id)
@@ -52,7 +51,7 @@ public:
, last_frame_(last_frame)
{
assert((transfer_type == TransferTypeMessageBroadcast) == dst_node_id.isBroadcast());
assert(data_type_id <= DataTypeDescriptor::MaxDataTypeID);
assert(data_type_id.isValid());
assert(src_node_id != dst_node_id);
assert(frame_index <= MaxIndex);
}
@@ -64,7 +63,7 @@ public:
const uint8_t* getPayloadPtr() const { return payload_; }
TransferType getTransferType() const { return transfer_type_; }
uint_fast16_t getDataTypeID() const { return data_type_id_; }
DataTypeID getDataTypeID() const { return data_type_id_; }
NodeID getSrcNodeID() const { return src_node_id_; }
NodeID getDstNodeID() const { return dst_node_id_; }
TransferID getTransferID() const { return transfer_id_; }
@@ -17,17 +17,16 @@ namespace uavcan
UAVCAN_PACKED_BEGIN
class OutgoingTransferRegistryKey
{
uint16_t data_type_id_;
DataTypeID data_type_id_;
uint8_t transfer_type_;
NodeID destination_node_id_; ///< Not applicable for message broadcasting
public:
OutgoingTransferRegistryKey()
: data_type_id_(0xFFFF)
, transfer_type_(0xFF)
: transfer_type_(0xFF)
{ }
OutgoingTransferRegistryKey(uint16_t data_type_id, TransferType transfer_type, NodeID destination_node_id)
OutgoingTransferRegistryKey(DataTypeID data_type_id, TransferType transfer_type, NodeID destination_node_id)
: data_type_id_(data_type_id)
, transfer_type_(transfer_type)
, destination_node_id_(destination_node_id)