summaryrefslogtreecommitdiffstats
path: root/src/URI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/URI.cpp')
-rw-r--r--src/URI.cpp97
1 files changed, 56 insertions, 41 deletions
diff --git a/src/URI.cpp b/src/URI.cpp
index f7b64209..3161b7d2 100644
--- a/src/URI.cpp
+++ b/src/URI.cpp
@@ -14,69 +14,72 @@
along with Ingen. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ingen/URI.hpp"
+#include <ingen/URI.hpp>
-#include "ingen/FilePath.hpp"
+#include <ingen/FilePath.hpp>
+#include <serd/serd.h>
+#include <sord/sordmm.hpp>
#include <cassert>
namespace ingen {
-URI::URI()
- : _uri(SERD_URI_NULL)
- , _node(SERD_NODE_NULL)
-{}
+URI::URI() : _uri(SERD_URI_NULL), _node(SERD_NODE_NULL) {}
URI::URI(const std::string& str)
- : _uri(SERD_URI_NULL)
- , _node(serd_node_new_uri_from_string((const uint8_t*)str.c_str(),
+ : _uri(SERD_URI_NULL)
+ , _node(serd_node_new_uri_from_string(reinterpret_cast<const uint8_t*>(
+ str.c_str()),
nullptr,
&_uri))
-{}
+{
+}
URI::URI(const char* str)
- : _uri(SERD_URI_NULL)
- , _node(serd_node_new_uri_from_string((const uint8_t*)str, nullptr, &_uri))
-{}
+ : _uri(SERD_URI_NULL)
+ , _node(serd_node_new_uri_from_string(reinterpret_cast<const uint8_t*>(str),
+ nullptr,
+ &_uri))
+{
+}
URI::URI(const std::string& str, const URI& base)
- : _uri(SERD_URI_NULL)
- , _node(serd_node_new_uri_from_string((const uint8_t*)str.c_str(),
+ : _uri(SERD_URI_NULL)
+ , _node(serd_node_new_uri_from_string(reinterpret_cast<const uint8_t*>(
+ str.c_str()),
&base._uri,
&_uri))
-{}
-
-URI::URI(SerdNode node)
- : _uri(SERD_URI_NULL)
- , _node(serd_node_new_uri_from_node(&node, nullptr, &_uri))
{
- assert(node.type == SERD_URI);
}
-URI::URI(SerdNode node, SerdURI uri)
- : _uri(uri)
- , _node(node)
+URI::URI(const SerdNode& node)
+ : _uri(SERD_URI_NULL)
+ , _node(serd_node_new_uri_from_node(&node, nullptr, &_uri))
{
assert(node.type == SERD_URI);
}
-URI::URI(const Sord::Node& node)
- : URI(*node.to_serd_node())
+URI::URI(const SerdNode& node, const SerdURI& uri) : _uri(uri), _node(node)
{
+ assert(node.type == SERD_URI);
}
+URI::URI(const Sord::Node& node) : URI(*node.to_serd_node()) {}
+
URI::URI(const FilePath& path)
- : _uri(SERD_URI_NULL)
- , _node(serd_node_new_file_uri((const uint8_t*)path.c_str(),
- nullptr,
- &_uri,
- true))
-{}
+ : _uri(SERD_URI_NULL)
+ , _node(
+ serd_node_new_file_uri(reinterpret_cast<const uint8_t*>(path.c_str()),
+ nullptr,
+ &_uri,
+ true))
+{
+}
URI::URI(const URI& uri)
- : _uri(SERD_URI_NULL)
- , _node(serd_node_new_uri(&uri._uri, nullptr, &_uri))
-{}
+ : _uri(SERD_URI_NULL), _node(serd_node_new_uri(&uri._uri, nullptr, &_uri))
+{
+}
URI&
URI::operator=(const URI& uri)
@@ -89,9 +92,7 @@ URI::operator=(const URI& uri)
return *this;
}
-URI::URI(URI&& uri) noexcept
- : _uri(uri._uri)
- , _node(uri._node)
+URI::URI(URI&& uri) noexcept : _uri(uri._uri), _node(uri._node)
{
uri._node = SERD_NODE_NULL;
uri._uri = SERD_URI_NULL;
@@ -100,6 +101,8 @@ URI::URI(URI&& uri) noexcept
URI&
URI::operator=(URI&& uri) noexcept
{
+ serd_node_free(&_node);
+
_node = uri._node;
_uri = uri._uri;
uri._node = SERD_NODE_NULL;
@@ -115,9 +118,21 @@ URI::~URI()
URI
URI::make_relative(const URI& base) const
{
- SerdURI uri;
- SerdNode node = serd_node_new_relative_uri(&_uri, &base._uri, nullptr, &uri);
- return URI(node, uri);
+ SerdURI uri;
+ const SerdNode node =
+ serd_node_new_relative_uri(&_uri, &base._uri, nullptr, &uri);
+
+ return {node, uri};
+}
+
+URI
+URI::make_relative(const URI& base, const URI& root) const
+{
+ SerdURI uri;
+ const SerdNode node =
+ serd_node_new_relative_uri(&_uri, &base._uri, &root._uri, &uri);
+
+ return {node, uri};
}
-} // namespace ingen
+} // namespace ingen