17#ifndef BIFROST_OBJECT_H
18#define BIFROST_OBJECT_H
38#define BIFROST_IGNORE_NAMESPACE AMINO_ANNOTATE("Amino::Namespace ignore")
40#undef BIFROST_IGNORE_NAMESPACE
59class AMINO_ANNOTATE("
Amino::Class metadata=[{type_kind, dictionary}]
") OBJECT_DECL Object {
61 /*----- static member functions -----*/
77 static bool isA(Object const& object, Object const& prototype);
89 Property(Amino::String key, T&& value);
95 /*----- member functions -----*/
111 virtual size_t size() const noexcept = 0;
115 virtual bool empty() const noexcept = 0;
120 virtual bool hasProperty(Amino::StringView key) const noexcept = 0;
127 virtual Amino::Any getProperty(Amino::StringView key) const noexcept = 0;
132 virtual Amino::Any extractProperty(Amino::StringView key) noexcept = 0;
137 virtual bool eraseProperty(Amino::StringView key) noexcept = 0;
140 virtual void eraseAllProperties() noexcept = 0;
145 virtual Amino::Ptr<Amino::Array<Amino::String>> keys() const noexcept = 0;
155 template <typename T>
156 bool setProperty(Amino::StringView key, T&& value) noexcept;
158 template <typename S, typename T>
159 typename std::enable_if<std::is_same<std::decay_t<S>,Amino::String>::value,bool>::type
160 setProperty(S&& key, T&& value) noexcept;
171 Object(Object&&) noexcept = default;
172 Object(Object const&) = default;
173 Object& operator=(Object&&) noexcept = default;
174 Object& operator=(Object const&) = default;
190 virtual bool setPropertyAny(Amino::StringView key, Amino::Any value) noexcept = 0;
191 virtual bool setPropertyAny(Amino::String const& key, Amino::Any value) noexcept = 0;
195//==============================================================================
197//==============================================================================
202//------------------------------------------------------------------------------
207Amino::MutablePtr<Object> createObject();
209//------------------------------------------------------------------------------
215Amino::MutablePtr<Object> createObject(
216 std::initializer_list<Object::Property> properties);
221//==============================================================================
222// Implementation details
223//==============================================================================
225//------------------------------------------------------------------------------
231inline Amino::Any makeAny(T&& v) {
232 return Amino::Any{std::forward<T>(v)};
234inline Amino::Any makeAny(Amino::Any v) { return v; }
235inline Amino::Any makeAny(const char* v) {
236 return Amino::Any{Amino::String(v)};
238inline Amino::Any makeAny(Amino::StringView v) {
239 return Amino::Any{Amino::String(v)};
242inline Amino::Any makeAny(Amino::MutablePtr<T> v) {
243 return Amino::Any{Amino::Ptr<T>{std::move(v)}};
245} // namespace Internal
247//==============================================================================
248// CLASS Object::Property
249//==============================================================================
252Object::Property::Property(Amino::String key, T&& value)
253 : m_key(std::move(key)),
254 m_value(Internal::makeAny(std::forward<T>(value))) // LCOV_EXCL_BR_LINE
257//==============================================================================
259//==============================================================================
262bool Object::setProperty(Amino::StringView key, T&& value) noexcept {
263 // LCOV_EXCL_BR_START
265 return false; // keys not allowed to be empty strings
267 return setPropertyAny(key, Internal::makeAny(std::forward<T>(value)));
271template <typename S, typename T>
272typename std::enable_if<std::is_same<std::decay_t<S>, Amino::String>::value, bool>::type
273Object::setProperty(S&& key, T&& value) noexcept {
274 // LCOV_EXCL_BR_START
276 return false; // keys not allowed to be empty strings
278 return setPropertyAny(key, Internal::makeAny(std::forward<T>(value)));
284} // namespace Bifrost BIFROST_IGNORE_NAMESPACE
286#endif // BIFROST_OBJECT_H
Forward declaration of Amino Array.
Smart pointers used to allow custom user classes (opaque classes) to be used within Amino graphs....
String view class (similar to std::string_view)
Header Parser Annotation Macro & Parser Documentation.
#define BIFROST_IGNORE_NAMESPACE
Use a define, otherwise clang-format gets confused.
Definition of macros for symbol visibility.
Bifrost object interface forward declaration.