aboutsummaryrefslogtreecommitdiffstats
path: root/nihil.ucl/object.ccm
diff options
context:
space:
mode:
Diffstat (limited to 'nihil.ucl/object.ccm')
-rw-r--r--nihil.ucl/object.ccm88
1 files changed, 88 insertions, 0 deletions
diff --git a/nihil.ucl/object.ccm b/nihil.ucl/object.ccm
new file mode 100644
index 0000000..9a7eaf7
--- /dev/null
+++ b/nihil.ucl/object.ccm
@@ -0,0 +1,88 @@
+/*
+ * This source code is released into the public domain.
+ */
+
+module;
+
+/*
+ * A UCL object. The object is immutable and internally refcounted, so it
+ * may be copied as needed.
+ *
+ */
+
+#include <compare>
+#include <cstddef>
+#include <string>
+
+#include <ucl.h>
+
+export module nihil.ucl:object;
+
+import :type;
+
+namespace nihil::ucl {
+
+/***********************************************************************
+ * The basic object type.
+ */
+
+// Ref the UCL object when creating an object.
+export inline constexpr struct ref_t {} ref;
+// Don't ref the UCL object.
+export inline constexpr struct noref_t {} noref;
+
+export struct object {
+ inline static constexpr object_type ucl_type = object_type::object;
+
+ // Create an object from an existing ucl_object_t. The first argument
+ // determines whether we ref the object or not.
+
+ object(ref_t, ::ucl_object_t const *object);
+ object(noref_t, ::ucl_object_t *object);
+
+ // Free our object on destruction.
+ virtual ~object();
+
+ // Movable.
+ object(object &&other) noexcept;
+ auto operator=(this object &self, object &&other) noexcept -> object&;
+
+ // Copyable.
+ // Note that this copies the entire UCL object.
+ object(object const &other);
+ auto operator=(this object &self, object const &other) -> object &;
+
+ // Increase the refcount of this object.
+ [[nodiscard]] auto ref(this object const &self) -> object;
+
+ // Return the type of this object.
+ [[nodiscard]] auto type(this object const &self) -> object_type;
+
+ // Return the underlying object.
+ [[nodiscard]] auto get_ucl_object(this object &self)
+ -> ::ucl_object_t *;
+
+ [[nodiscard]] auto get_ucl_object(this object const &self)
+ -> ::ucl_object_t const *;
+
+ // Return the key of this object.
+ [[nodiscard]] auto key(this object const &self) -> std::string_view;
+
+protected:
+ // The object we're wrapping.
+ ::ucl_object_t *m_object = nullptr;
+
+ friend auto swap(object &a, object &b) -> void;
+};
+
+/***********************************************************************
+ * Object comparison.
+ */
+
+export [[nodiscard]] auto operator==(object const &lhs, object const &rhs)
+ -> bool;
+
+export [[nodiscard]] auto operator<=>(object const &lhs, object const &rhs)
+ -> std::strong_ordering;
+
+} // namespace nihil::ucl