From e567c16fd0ce66c13e8e1aa7d435ee272d2f13e7 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Thu, 10 Apr 2014 22:51:37 +0400 Subject: [PATCH] Compact Entry constructor for GlobalDataTypeRegistry::regist<>() --- .../uavcan/node/global_data_type_registry.hpp | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/libuavcan/include/uavcan/node/global_data_type_registry.hpp b/libuavcan/include/uavcan/node/global_data_type_registry.hpp index 25f2709568..8542e43aad 100644 --- a/libuavcan/include/uavcan/node/global_data_type_registry.hpp +++ b/libuavcan/include/uavcan/node/global_data_type_registry.hpp @@ -142,23 +142,37 @@ GlobalDataTypeRegistry::RegistResult GlobalDataTypeRegistry::regist(DataTypeID i return RegistResultFrozen; } - static Entry entry; + static union EntryUnion { - const RegistResult remove_res = remove(&entry); + uint8_t buffer[sizeof(Entry)]; + long long _aligner_1; + long double _aligner_2; + } storage; + static bool constructed = false; + if (!constructed) + { + new (storage.buffer) Entry(); + constructed = true; + } + + Entry* const entry = reinterpret_cast(storage.buffer); + + { + const RegistResult remove_res = remove(entry); if (remove_res != RegistResultOk) { return remove_res; } } - entry = Entry(DataTypeKind(Type::DataTypeKind), id, Type::getDataTypeSignature(), Type::getDataTypeFullName()); + new (storage.buffer) Entry(DataTypeKind(Type::DataTypeKind), id, Type::getDataTypeSignature(), Type::getDataTypeFullName()); { - const RegistResult remove_res = remove(&entry); + const RegistResult remove_res = remove(entry); if (remove_res != RegistResultOk) { return remove_res; } } - return registImpl(&entry); + return registImpl(entry); } }