7#include <unordered_map>
8#include <unordered_set>
28constexpr auto DatasetField = AQNWB::Types::StorageObjectType::Dataset;
60 std::shared_ptr<AQNWB::IO::BaseIO> io);
82 return std::filesystem::path(
m_path).filename().string();
89 inline std::shared_ptr<AQNWB::IO::BaseIO>
getIO()
const {
return m_io; }
101 inline const std::unordered_map<std::string,
102 std::shared_ptr<IO::BaseRecordingData>>&
119 static std::unordered_set<std::string>&
getRegistry();
132 static std::unordered_map<
134 std::pair<std::function<std::unique_ptr<RegisteredType>(
135 const std::string&, std::shared_ptr<AQNWB::IO::BaseIO>)>,
136 std::pair<std::string, std::string>>>&
154 static std::shared_ptr<RegisteredType>
create(
155 const std::string& fullClassName,
156 const std::string& path,
157 std::shared_ptr<IO::BaseIO> io,
158 bool fallbackToBase =
false);
180 static std::shared_ptr<AQNWB::NWB::RegisteredType>
create(
181 const std::string& path,
182 std::shared_ptr<IO::BaseIO> io,
183 bool fallbackToBase =
false);
195 static inline std::shared_ptr<T>
create(
const std::string& path,
196 std::shared_ptr<AQNWB::IO::BaseIO> io)
198 static_assert(std::is_base_of<RegisteredType, T>::value,
199 "T must be a derived class of RegisteredType");
200 return std::shared_ptr<T>(
new T(path, io));
263 typename std::enable_if<Types::IsDataStorageObjectType<SOT>::value,
265 inline std::unique_ptr<AQNWB::IO::ReadDataWrapper<SOT, VTYPE>>
readField(
266 const std::string& fieldPath)
const
268 return std::make_unique<AQNWB::IO::ReadDataWrapper<SOT, VTYPE>>(
280 inline std::shared_ptr<AQNWB::NWB::RegisteredType>
readField(
281 const std::string& fieldPath)
const
304 virtual std::unordered_map<std::string, std::string>
findOwnedTypes(
305 const std::unordered_set<std::string>& types = {},
328 const std::string& fullClassName,
329 std::function<std::unique_ptr<RegisteredType>(
330 const std::string&, std::shared_ptr<AQNWB::IO::BaseIO>)>
332 const std::string& typeName,
333 const std::string& typeNamespace);
343 std::shared_ptr<IO::BaseIO>
m_io;
357 std::unordered_map<std::string, std::shared_ptr<IO::BaseRecordingData>>
378#define REGISTER_SUBCLASS_WITH_TYPENAME(T, NAMESPACE_VAR, TYPENAME) \
379 static bool registerSubclass() \
381 AQNWB::NWB::RegisteredType::registerSubclass( \
382 std::string(NAMESPACE_VAR) + "::" + #T, \
383 [](const std::string& path, std::shared_ptr<AQNWB::IO::BaseIO> io) \
384 -> std::unique_ptr<AQNWB::NWB::RegisteredType> \
385 { return std::make_unique<T>(path, io); }, \
390 static bool registered_; \
391 virtual std::string getTypeName() const override \
395 virtual std::string getNamespace() const override \
397 return NAMESPACE_VAR; \
410#define REGISTER_SUBCLASS(T, NAMESPACE) \
411 REGISTER_SUBCLASS_WITH_TYPENAME(T, NAMESPACE, #T)
422#define REGISTER_SUBCLASS_IMPL(T) bool T::registered_ = T::registerSubclass();
443#define DEFINE_ATTRIBUTE_FIELD(name, default_type, fieldPath, description) \
452 template<typename VTYPE = default_type> \
453 inline std::unique_ptr<AQNWB::IO::ReadDataWrapper<AttributeField, VTYPE>> \
456 return std::make_unique< \
457 AQNWB::IO::ReadDataWrapper<AttributeField, VTYPE>>( \
458 m_io, AQNWB::mergePaths(m_path, fieldPath)); \
482#define DEFINE_DATASET_FIELD( \
483 readName, writeName, default_type, fieldPath, description) \
492 template<typename VTYPE = default_type> \
493 inline std::unique_ptr< \
494 AQNWB::IO::ReadDataWrapper<AQNWB::NWB::DatasetField, VTYPE>> \
497 return std::make_unique< \
498 AQNWB::IO::ReadDataWrapper<AQNWB::NWB::DatasetField, VTYPE>>( \
499 m_io, AQNWB::mergePaths(m_path, fieldPath)); \
514 inline std::shared_ptr<AQNWB::IO::BaseRecordingData> writeName(bool reset = \
517 std::string fullPath = AQNWB::mergePaths(m_path, fieldPath); \
520 auto it = m_recordingDataCache.find(fullPath); \
521 if (it != m_recordingDataCache.end()) { \
526 auto dataset = m_io->getDataSet(fullPath); \
528 m_recordingDataCache[fullPath] = dataset; \
554#define DEFINE_REGISTERED_FIELD(name, registeredType, fieldPath, description) \
567 template<typename RTYPE = registeredType> \
568 inline std::shared_ptr<RTYPE> name() const \
570 std::string objectPath = AQNWB::mergePaths(m_path, fieldPath); \
571 if (m_io->objectExists(objectPath)) { \
572 return RegisteredType::create<RTYPE>(objectPath, m_io); \
598#define DEFINE_REFERENCED_REGISTERED_FIELD( \
599 name, registeredType, fieldPath, description) \
612 template<typename RTYPE = registeredType> \
613 inline std::shared_ptr<RTYPE> name() const \
616 std::string attrPath = AQNWB::mergePaths(m_path, fieldPath); \
617 std::string objectPath = m_io->readReferenceAttribute(attrPath); \
618 if (m_io->objectExists(objectPath)) { \
619 return RegisteredType::create<RTYPE>(objectPath, m_io); \
621 } catch (const std::exception& e) { \
AQNWB::Types::StorageObjectType StorageObjectType
Definition BaseIO.hpp:21
std::shared_ptr< AQNWB::NWB::RegisteredType > readField(const std::string &fieldPath) const
Read a field that is itself a RegisteredType.
Definition RegisteredType.hpp:280
std::string getFullTypeName() const
Get the full name of the type, i.e., namespace::typename
Definition RegisteredType.hpp:236
virtual std::string getTypeName() const
Get the name of the class type.
Definition RegisteredType.cpp:60
static std::shared_ptr< T > create(const std::string &path, std::shared_ptr< AQNWB::IO::BaseIO > io)
Factory method to create an instance of a subclass of RegisteredType by type.
Definition RegisteredType.hpp:195
std::string m_path
The path of the registered type.
Definition RegisteredType.hpp:338
static const std::string m_defaultUnregisteredDatasetTypeClass
Save the default RegisteredType to use for reading Dataset types that are not registered.
Definition RegisteredType.hpp:316
void clearRecordingDataCache()
Clear the BaseRecordingData object cache to reset the recording state.
Definition RegisteredType.hpp:95
std::unordered_map< std::string, std::shared_ptr< IO::BaseRecordingData > > m_recordingDataCache
Cache for BaseRecordingData objects for datasets to retain recording state.
Definition RegisteredType.hpp:358
std::shared_ptr< IO::BaseIO > m_io
A shared pointer to the IO object.
Definition RegisteredType.hpp:343
virtual std::string getNamespace() const
Get the schema namespace of the class type.
Definition RegisteredType.cpp:67
static void registerSubclass(const std::string &fullClassName, std::function< std::unique_ptr< RegisteredType >(const std::string &, std::shared_ptr< AQNWB::IO::BaseIO >)> factoryFunction, const std::string &typeName, const std::string &typeNamespace)
Register a subclass name and its factory function in the registry.
Definition RegisteredType.cpp:46
static std::shared_ptr< RegisteredType > create(const std::string &fullClassName, const std::string &path, std::shared_ptr< IO::BaseIO > io, bool fallbackToBase=false)
Create an instance of a registered subclass by name.
Definition RegisteredType.cpp:72
static std::unordered_map< std::string, std::pair< std::function< std::unique_ptr< RegisteredType >(const std::string &, std::shared_ptr< AQNWB::IO::BaseIO >)>, std::pair< std::string, std::string > > > & getFactoryMap()
Get the factory map for creating instances of subclasses.
Definition RegisteredType.cpp:35
virtual std::unordered_map< std::string, std::string > findOwnedTypes(const std::unordered_set< std::string > &types={}, const AQNWB::IO::SearchMode &search_mode=AQNWB::IO::SearchMode::STOP_ON_TYPE) const
Find all typed objects that are owned by this object, i.e., objects that have a neurodata_type and na...
Definition RegisteredType.cpp:118
std::string getName() const
Get the name of the object.
Definition RegisteredType.hpp:80
RegisteredType(const std::string &path, std::shared_ptr< AQNWB::IO::BaseIO > io)
Constructor.
Definition RegisteredType.cpp:15
std::string getPath() const
Gets the path of the registered type.
Definition RegisteredType.hpp:71
std::shared_ptr< AQNWB::IO::BaseIO > getIO() const
Get a shared pointer to the IO object.
Definition RegisteredType.hpp:89
static std::unordered_set< std::string > & getRegistry()
Get the registry of subclass names.
Definition RegisteredType.cpp:24
virtual ~RegisteredType()
Destructor.
Definition RegisteredType.cpp:22
static const std::string m_defaultUnregisteredGroupTypeClass
Save the default RegisteredType to use for reading Group types that are not registered.
Definition RegisteredType.hpp:312
const std::unordered_map< std::string, std::shared_ptr< IO::BaseRecordingData > > & getCacheRecordingData() const
Get the cache of BaseRecordingData objects.
Definition RegisteredType.hpp:103
std::unique_ptr< AQNWB::IO::ReadDataWrapper< SOT, VTYPE > > readField(const std::string &fieldPath) const
Support reading of arbitrary fields by their relative path.
Definition RegisteredType.hpp:265
SearchMode
Enum class for specifying the search mode for findTypes.
Definition BaseIO.hpp:152
@ STOP_ON_TYPE
Stop searching inside an object once a matching type is found.
Definition BaseIO.hpp:156
Namespace for all classes related to the NWB data standard.
Definition TimeSeries.hpp:13
constexpr auto AttributeField
Alias for AQNWB::Types::StorageObjectType::Attribute.
Definition RegisteredType.hpp:23
constexpr auto DatasetField
Alias for AQNWB::Types::StorageObjectType::Dataset.
Definition RegisteredType.hpp:28
The main namespace for AqNWB.
Definition Channel.hpp:11
static std::string mergePaths(const std::string &path1, const std::string &path2)
Merge two paths into a single path, handling extra trailing and starting "/".
Definition Utils.hpp:112