opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
component_registry_base.h
Go to the documentation of this file.
1#pragma once
2
4
6#include <OpenSim/Common/Component.h>
7
8#include <concepts>
9#include <cstddef>
10#include <optional>
11#include <string>
12#include <string_view>
13#include <typeinfo>
14#include <utility>
15#include <vector>
16
17namespace opyn
18{
19 // Represents a type-erased sequence of named/described `OpenSim::Component`s.
21 public:
25 using const_iterator = const value_type*;
26 using size_type = size_t;
27
28 osc::CStringView name() const { return m_Name; }
29 osc::CStringView description() const { return m_Description; }
30
31 const_iterator begin() const { return m_Entries.data(); }
32 const_iterator end() const { return m_Entries.data() + m_Entries.size(); }
33 size_type size() const { return m_Entries.size(); }
34 const_reference operator[](size_type pos) const { return m_Entries[pos]; }
35
36 protected:
38 std::string_view name_,
39 std::string_view description_) :
40
41 m_Name{name_},
42 m_Description{description_}
43 {}
44
45 template<typename... Args>
46 requires std::constructible_from<ComponentRegistryEntryBase, Args&&...>
48 {
49 return m_Entries.emplace_back(std::forward<Args>(args)...);
50 }
51
52 private:
53 std::string m_Name;
54 std::string m_Description;
55 std::vector<ComponentRegistryEntryBase> m_Entries;
56 };
57
58 std::optional<size_t> IndexOf(const ComponentRegistryBase&, std::string_view componentClassName);
59 std::optional<size_t> IndexOf(const ComponentRegistryBase&, const OpenSim::Component&);
60
61 template<typename T>
62 std::optional<size_t> IndexOf(const ComponentRegistryBase& registry)
63 {
64 for (size_t i = 0; i < registry.size(); ++i) {
65 const OpenSim::Component& prototype = registry[i].prototype();
66 if (typeid(prototype) == typeid(T)) {
67 return i;
68 }
69 }
70 return std::nullopt;
71 }
72}
Definition component_registry_base.h:20
ComponentRegistryBase(std::string_view name_, std::string_view description_)
Definition component_registry_base.h:37
const_iterator begin() const
Definition component_registry_base.h:31
size_t size_type
Definition component_registry_base.h:26
const_iterator end() const
Definition component_registry_base.h:32
osc::CStringView description() const
Definition component_registry_base.h:29
osc::CStringView name() const
Definition component_registry_base.h:28
reference emplace_back_erased(Args &&... args)
Definition component_registry_base.h:47
const_reference operator[](size_type pos) const
Definition component_registry_base.h:34
size_type size() const
Definition component_registry_base.h:33
Definition component_registry_entry_base.h:12
Definition c_string_view.h:12
Definition component_registry.h:14
std::optional< size_t > IndexOf(const ComponentRegistryBase &, std::string_view componentClassName)