diff options
Diffstat (limited to 'src/URI.cpp')
-rw-r--r-- | src/URI.cpp | 97 |
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 |