diff options
-rw-r--r-- | CMakeLists.txt | 23 | ||||
-rw-r--r-- | README.md | 50 | ||||
-rw-r--r-- | include/Uri/Uri.hpp | 53 | ||||
-rw-r--r-- | src/Uri.cpp | 25 | ||||
-rw-r--r-- | test/CMakeLists.txt | 25 | ||||
-rw-r--r-- | test/src/UriTests.cpp | 15 |
6 files changed, 191 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bfd19d7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,23 @@ +# CMakeLists.txt for Uri +# +# © 2018 by Richard Walters + +cmake_minimum_required(VERSION 3.8) +set(This Uri) + +set(Headers + include/Uri/Uri.hpp +) + +set(Sources + src/Uri.cpp +) + +add_library(${This} STATIC ${Sources} ${Headers}) +set_target_properties(${This} PROPERTIES + FOLDER Libraries +) + +target_include_directories(${This} PUBLIC include) + +add_subdirectory(test) diff --git a/README.md b/README.md new file mode 100644 index 0000000..c9d305b --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# Uri + +This is a library which implements [RFC 3986](https://tools.ietf.org/html/rfc3986), +"Uniform Resource Identifier (URI): Generic Syntax". + +## Usage + +The `Uri::Uri` class is used to parse URIs from strings, render URIs as strings, and get or set the individual elements of a URI. + +## Supported platforms / recommended toolchains + +This is a portable C++11 library which depends only on the C++11 compiler and standard library, so it should be supported on almost any platform. The following are recommended toolchains for popular platforms. + +* Windows -- [Visual Studio](https://www.visualstudio.com/) (Microsoft Visual C++) +* Linux -- clang or gcc +* MacOS -- Xcode (clang) + +## Building + +This library is not intended to stand alone. It is intended to be included in a larger solution which uses [CMake](https://cmake.org/) to generate the build system and build applications which will link with the library. + +There are two distinct steps in the build process: + +1. Generation of the build system, using CMake +2. Compiling, linking, etc., using CMake-compatible toolchain + +### Prerequisites + +* [CMake](https://cmake.org/) version 3.8 or newer +* C++11 toolchain compatible with CMake for your development platform (e.g. [Visual Studio](https://www.visualstudio.com/) on Windows) + +### Build system generation + +Generate the build system using [CMake](https://cmake.org/) from the solution root. For example: + +```bash +mkdir build +cd build +cmake -G "Visual Studio 15 2017" -A "x64" .. +``` + +### Compiling, linking, etc. + +Either use [CMake](https://cmake.org/) or your toolchain's IDE to build. +For [CMake](https://cmake.org/): + +```bash +cd build +cmake --build . --config Release +``` diff --git a/include/Uri/Uri.hpp b/include/Uri/Uri.hpp new file mode 100644 index 0000000..b5f85c2 --- /dev/null +++ b/include/Uri/Uri.hpp @@ -0,0 +1,53 @@ +#ifndef URI_HPP +#define URI_HPP + +/** + * @file Uri.hpp + * + * This module declares the Uri::Uri class. + * + * © 2018 by Richard Walters + */ + +#include <memory> + +namespace Uri { + + /** + * This class represents a Uniform Resource Identifier (URI), + * as defined in RFC 3986 (https://tools.ietf.org/html/rfc3986). + */ + class Uri { + // Lifecycle management + public: + ~Uri(); + Uri(const Uri&) = delete; + Uri(Uri&&) = delete; + Uri& operator=(const Uri&) = delete; + Uri& operator=(Uri&&) = delete; + + // Public methods + public: + /** + * This is the default constructor. + */ + Uri(); + + // Private properties + private: + /** + * This is the type of structure that contains the private + * properties of the instance. It is defined in the implementation + * and declared here to ensure that it is scoped inside the class. + */ + struct Impl; + + /** + * This contains the private properties of the instance. + */ + std::unique_ptr< struct Impl > impl_; + }; + +} + +#endif /* URI_HPP */ diff --git a/src/Uri.cpp b/src/Uri.cpp new file mode 100644 index 0000000..d63a5a9 --- /dev/null +++ b/src/Uri.cpp @@ -0,0 +1,25 @@ +/** + * @file Uri.cpp + * + * This module contains the implementation of the Uri::Uri class. + * + * © 2018 by Richard Walters + */ + +#include <Uri/Uri.hpp> + +namespace Uri { + /** + * This contains the private properties of a Uri instance. + */ + struct Uri::Impl { + }; + + Uri::~Uri() = default; + + Uri::Uri() + : impl_(new Impl) + { + } + +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..7c3eb76 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,25 @@ +# CMakeLists.txt for UriTests +# +# © 2018 by Richard Walters + +cmake_minimum_required(VERSION 3.8) +set(This UriTests) + +set(Sources + src/UriTests.cpp +) + +add_executable(${This} ${Sources}) +set_target_properties(${This} PROPERTIES + FOLDER Tests +) + +target_link_libraries(${This} PUBLIC + gtest_main + Uri +) + +add_test( + NAME ${This} + COMMAND ${This} +) diff --git a/test/src/UriTests.cpp b/test/src/UriTests.cpp new file mode 100644 index 0000000..3cb5336 --- /dev/null +++ b/test/src/UriTests.cpp @@ -0,0 +1,15 @@ +/** + * @file UriTests.cpp + * + * This module contains the unit tests of the Uri::Uri class. + * + * © 2018 by Richard Walters + */ + +#include <gtest/gtest.h> +#include <Uri/Uri.hpp> + +TEST(UriTests, Placeholder) { + Uri::Uri uri; + ASSERT_TRUE(true); +} |