GDTR got the method find() by DTID

This commit is contained in:
Pavel Kirienko
2014-03-18 16:38:14 +04:00
parent f5fd0ffe26
commit 2103e59ef1
3 changed files with 27 additions and 0 deletions
@@ -98,6 +98,7 @@ public:
bool isFrozen() const { return frozen_; }
const DataTypeDescriptor* find(DataTypeKind kind, const char* name) const;
const DataTypeDescriptor* find(DataTypeKind kind, DataTypeID dtid) const;
DataTypeSignature computeAggregateSignature(DataTypeKind kind, DataTypeIDMask& inout_id_mask) const;
@@ -140,6 +140,24 @@ const DataTypeDescriptor* GlobalDataTypeRegistry::find(DataTypeKind kind, const
return NULL;
}
const DataTypeDescriptor* GlobalDataTypeRegistry::find(DataTypeKind kind, DataTypeID dtid) const
{
const List* list = selectList(kind);
if (!list)
{
assert(0);
return NULL;
}
Entry* p = list->get();
while (p)
{
if (p->descriptor.match(kind, dtid))
return &p->descriptor;
p = p->getNextListNode();
}
return NULL;
}
DataTypeSignature GlobalDataTypeRegistry::computeAggregateSignature(DataTypeKind kind,
DataTypeIDMask& inout_id_mask) const
{
@@ -166,17 +166,25 @@ TEST(GlobalDataTypeRegistry, Basic)
*/
const uavcan::DataTypeDescriptor* pdtd = NULL;
ASSERT_FALSE(GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, "Nonexistent"));
ASSERT_FALSE(GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, 987));
// Asking for service, but this is a message:
ASSERT_FALSE(GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindService, "my_namespace.DataTypeB"));
ASSERT_FALSE(GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindService, 42));
ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, "my_namespace.DataTypeB")));
ASSERT_EQ(extractDescriptor<DataTypeB>(741), *pdtd);
ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, 741)));
ASSERT_EQ(extractDescriptor<DataTypeB>(741), *pdtd);
ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, "my_namespace.DataTypeA")));
ASSERT_EQ(extractDescriptor<DataTypeAMessage>(), *pdtd);
ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindMessage, uavcan::DataTypeID(0))));
ASSERT_EQ(extractDescriptor<DataTypeAMessage>(), *pdtd);
ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindService, "my_namespace.DataTypeA")));
ASSERT_EQ(extractDescriptor<DataTypeAService>(147), *pdtd);
ASSERT_TRUE((pdtd = GlobalDataTypeRegistry::instance().find(uavcan::DataTypeKindService, 147)));
ASSERT_EQ(extractDescriptor<DataTypeAService>(147), *pdtd);
}