summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2019-03-10 22:44:50 +0100
committerDavid Robillard <d@drobilla.net>2021-03-16 19:08:37 -0400
commitabce3c01977c4a56952dac20de14076f86d58d74 (patch)
treebca5188eefe33a3a396e97004d6ea3a63b1f7632
parent50bbbafd8cb7cac121e7fd37458a1975dd818611 (diff)
downloadsratom-abce3c01977c4a56952dac20de14076f86d58d74.tar.gz
sratom-abce3c01977c4a56952dac20de14076f86d58d74.tar.bz2
sratom-abce3c01977c4a56952dac20de14076f86d58d74.zip
WIP: Add C++ bindings
-rw-r--r--bindings/cpp/include/sratom/sratom.hpp185
-rw-r--r--bindings/cpp/meson.build76
-rw-r--r--bindings/cpp/test/test_sratom_hpp.cpp25
-rw-r--r--meson_options.txt3
-rw-r--r--tests/sratom_cxx_test.cpp23
5 files changed, 312 insertions, 0 deletions
diff --git a/bindings/cpp/include/sratom/sratom.hpp b/bindings/cpp/include/sratom/sratom.hpp
new file mode 100644
index 0000000..5cd337e
--- /dev/null
+++ b/bindings/cpp/include/sratom/sratom.hpp
@@ -0,0 +1,185 @@
+/*
+ Copyright 2019-2021 David Robillard <d@drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+/// @file sratom.hpp C++ API for Sratom
+
+#ifndef SRATOM_SRATOM_HPP
+#define SRATOM_SRATOM_HPP
+
+#include "lv2/urid/urid.h"
+#include "serd/serd.hpp"
+#include "sratom/sratom.h"
+
+#include <cstdint>
+#include <sstream>
+
+/**
+ @defgroup sratomxx Sratomxx
+ C++ bindings for Sratom, a library for serialising LV2 atoms.
+ @{
+*/
+
+namespace sratom {
+
+namespace detail {
+
+struct Deleter {
+ void operator()(void* ptr) { sratom_free(ptr); }
+};
+
+} // namespace detail
+
+/// Flags to control how atoms are written and read
+typedef enum {
+ /**
+ Write the main subject with a label.
+
+ If set, the main subject will be written using its blank node label,
+ instead of as an anonymous node.
+ */
+ named_subject = SRATOM_NAMED_SUBJECT,
+
+ /**
+ Write pretty numeric literals.
+
+ If set, numbers may be written as pretty literals instead of string
+ literals with explicit data types. Note that enabling this means that
+ types will not survive a round trip.
+ */
+ pretty_numbers = SRATOM_PRETTY_NUMBERS,
+
+ /**
+ Write terse output without newlines.
+
+ If set, top level atoms will be written as a single long line.
+ */
+ terse = SRATOM_TERSE,
+} Flag;
+
+using Flags = serd::detail::Flags<Flag>;
+
+class Dumper
+ : public serd::detail::BasicWrapper<SratomDumper, sratom_dumper_free>
+{
+public:
+ Dumper(serd::World& world, LV2_URID_Map& map, LV2_URID_Unmap& unmap)
+ : BasicWrapper(sratom_dumper_new(world.cobj(), &map, &unmap))
+ {}
+
+ int write(const serd::Env& env,
+ serd::SinkView sink,
+ const LV2_Atom& atom,
+ const Flags flags = {})
+ {
+ return sratom_dump_atom(
+ cobj(), env.cobj(), sink.cobj(), nullptr, nullptr, &atom, flags);
+ }
+
+ int write(const serd::Env& env,
+ serd::SinkView sink,
+ const serd::Node& subject,
+ const serd::Node& predicate,
+ const LV2_Atom& atom,
+ const Flags flags = {})
+ {
+ return sratom_dump_atom(cobj(),
+ env.cobj(),
+ sink.cobj(),
+ subject.cobj(),
+ predicate.cobj(),
+ &atom,
+ flags);
+ }
+
+ int write(const serd::Env& env,
+ serd::SinkView sink,
+ const serd::Node& subject,
+ const serd::Node& predicate,
+ LV2_URID type,
+ uint32_t size,
+ const void* body,
+ const Flags flags = {})
+ {
+ return sratom_dump(cobj(),
+ env.cobj(),
+ sink.cobj(),
+ subject.cobj(),
+ predicate.cobj(),
+ type,
+ size,
+ body,
+ flags);
+ }
+
+ std::string to_string(const serd::Env& env,
+ const LV2_Atom& atom,
+ const Flags flags = {})
+ {
+ char* c_str = sratom_to_string(cobj(), env.cobj(), &atom, flags);
+ std::string result = c_str;
+ sratom_free(c_str);
+ return result;
+ }
+
+private:
+ static size_t string_sink(const void* buf, size_t, size_t nmemb, void* stream)
+ {
+ std::string& string = *(std::string*)stream;
+ string.insert(string.size(), static_cast<const char*>(buf), nmemb);
+ return nmemb;
+ }
+};
+
+class Loader
+ : public serd::detail::BasicWrapper<SratomLoader, sratom_loader_free>
+{
+public:
+ using AtomPtr = std::unique_ptr<LV2_Atom, detail::Deleter>;
+
+ Loader(serd::World& world, LV2_URID_Map& map)
+ : BasicWrapper(sratom_loader_new(world.cobj(), &map))
+ {}
+
+ int read(const serd::Optional<serd::Node>& base_uri,
+ LV2_Atom_Forge& forge,
+ const serd::Model& model,
+ const serd::Node& node)
+ {
+ return sratom_load(
+ cobj(), base_uri.cobj(), &forge, model.cobj(), node.cobj());
+ }
+
+ AtomPtr read_string(serd::Env& env, const char* str)
+ {
+ return AtomPtr{sratom_from_string(cobj(), env.cobj(), str)};
+ }
+
+ AtomPtr read_model(const serd::Optional<serd::Node>& base_uri,
+ const serd::Model& model,
+ const serd::Node& subject)
+ {
+ return AtomPtr{
+ sratom_from_model(cobj(), base_uri.cobj(), model.cobj(), subject.cobj())};
+ }
+};
+
+} // namespace sratom
+
+/**
+ @}
+*/
+
+#endif // SRATOM_SRATOM_HPP
diff --git a/bindings/cpp/meson.build b/bindings/cpp/meson.build
new file mode 100644
index 0000000..ee1dc4f
--- /dev/null
+++ b/bindings/cpp/meson.build
@@ -0,0 +1,76 @@
+versioned_cpp_name = 'sratompp' + version_suffix
+
+# Set ultra strict warnings for developers, if requested
+cpp_suppressions = []
+if get_option('strict')
+ if cpp.get_id() == 'clang'
+ cpp_suppressions += [
+ '-Wno-documentation-unknown-command',
+ '-Wno-format-nonliteral',
+ '-Wno-nullability-extension',
+ '-Wno-padded',
+ ]
+ elif cpp.get_id() == 'gcc'
+ cpp_suppressions += [
+ '-Wno-abi-tag',
+ '-Wno-float-equal',
+ '-Wno-inline',
+ '-Wno-multiple-inheritance',
+ '-Wno-padded',
+ '-Wno-suggest-attribute=pure',
+ '-Wno-switch-default',
+ '-Wno-unused-const-variable',
+ ]
+ elif cpp.get_id() == 'msvc'
+ cpp_suppressions += [
+ '/wd4355', # 'this' used in base member initializer list
+ '/wd4571', # structured exceptions are no longer caught
+ '/wd4623', # default constructor implicitly deleted
+ '/wd4625', # copy constructor implicitly deleted
+ '/wd4626', # assignment operator implicitly deleted
+ '/wd4710', # function not inlined
+ '/wd4868', # may not enforce left-to-right evaluation order
+ '/wd5026', # move constructor implicitly deleted
+ '/wd5027', # move assignment operator implicitly deleted
+ ]
+ endif
+else
+ if cpp.get_id() == 'clang'
+ cpp_suppressions += [
+ '-Wno-nullability-extension',
+ ]
+ endif
+endif
+
+exess_cpp_args = cpp.get_supported_arguments(cpp_suppressions)
+
+cpp_headers = [
+ 'include/sratom/sratom.hpp',
+]
+
+serdpp_dep = dependency('serdxx-1',
+ version: '>= 1.0.0')
+
+sratompp_dep = declare_dependency(
+ include_directories: include_directories(['include']),
+ link_with: libsratom)
+
+pkg.generate(
+ description: 'C++ bindings for sratom',
+ filebase: versioned_cpp_name,
+ name: 'Sratompp',
+ subdirs: [versioned_cpp_name],
+ version: meson.project_version())
+
+# Install headers to a versioned include directory
+install_headers(cpp_headers, subdir: versioned_cpp_name / 'sratom')
+
+cpp_test_args = cpp.get_supported_arguments(['-Wno-float-equal'])
+
+test('bindings',
+ executable('test_sratom_hpp',
+ 'test/test_sratom_hpp.cpp',
+ include_directories: include_directories(['include']),
+ cpp_args: exess_cpp_args + cpp_test_args,
+ dependencies: [sratom_dep, serdpp_dep, sratompp_dep]),
+ suite: 'cpp')
diff --git a/bindings/cpp/test/test_sratom_hpp.cpp b/bindings/cpp/test/test_sratom_hpp.cpp
new file mode 100644
index 0000000..2ada056
--- /dev/null
+++ b/bindings/cpp/test/test_sratom_hpp.cpp
@@ -0,0 +1,25 @@
+/*
+ Copyright 2018-2021 David Robillard <d@drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#undef NDEBUG
+
+#include "sratom/sratom.hpp"
+
+int
+main()
+{
+ return 0;
+}
diff --git a/meson_options.txt b/meson_options.txt
index a5ec648..e93e209 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,3 +1,6 @@
+option('bindings_cpp', type: 'feature', value: 'auto', yield: true,
+ description: 'Build C++ bindings')
+
option('docs', type: 'feature', value: 'auto', yield: true,
description: 'Build documentation')
diff --git a/tests/sratom_cxx_test.cpp b/tests/sratom_cxx_test.cpp
new file mode 100644
index 0000000..76b388a
--- /dev/null
+++ b/tests/sratom_cxx_test.cpp
@@ -0,0 +1,23 @@
+/*
+ Copyright 2019 David Robillard <http://drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#include "sratom/sratom.hpp"
+
+int
+main()
+{
+ return 0;
+}