diff --git a/.github/workflows/website-build.yml b/.github/workflows/website-build.yml index 00f8cf3dd..4b931ddd8 100644 --- a/.github/workflows/website-build.yml +++ b/.github/workflows/website-build.yml @@ -16,7 +16,6 @@ jobs: - run: > cmake -S . -B ./build -DCMAKE_BUILD_TYPE:STRING=Release - -DJSONTOOLKIT_REGEX:BOOL=OFF -DJSONTOOLKIT_URI:BOOL=OFF -DJSONTOOLKIT_JSON:BOOL=OFF -DJSONTOOLKIT_JSONSCHEMA:BOOL=OFF diff --git a/.github/workflows/website-deploy.yml b/.github/workflows/website-deploy.yml index 2b8a58a80..a62c04c45 100644 --- a/.github/workflows/website-deploy.yml +++ b/.github/workflows/website-deploy.yml @@ -26,7 +26,6 @@ jobs: - run: > cmake -S . -B ./build -DCMAKE_BUILD_TYPE:STRING=Release - -DJSONTOOLKIT_REGEX:BOOL=OFF -DJSONTOOLKIT_URI:BOOL=OFF -DJSONTOOLKIT_JSON:BOOL=OFF -DJSONTOOLKIT_JSONSCHEMA:BOOL=OFF diff --git a/CMakeLists.txt b/CMakeLists.txt index b5d79899e..ff4428eee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,6 @@ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") # Options option(JSONTOOLKIT_URI "Build the JSON Toolkit URI library" ON) option(JSONTOOLKIT_JSON "Build the JSON Toolkit JSON library" ON) -option(JSONTOOLKIT_REGEX "Build the JSON Toolkit Regex library" ON) option(JSONTOOLKIT_JSONSCHEMA "Build the JSON Toolkit JSON Schema library" ON) option(JSONTOOLKIT_JSONPOINTER "Build the JSON Toolkit JSON Pointer library" ON) option(JSONTOOLKIT_JSONL "Build the JSON Toolkit JSONL library" ON) @@ -49,11 +48,6 @@ if(JSONTOOLKIT_JSON) add_subdirectory(src/json) endif() -if(JSONTOOLKIT_JSON AND JSONTOOLKIT_REGEX) - find_package(BoostRegex REQUIRED) - add_subdirectory(src/regex) -endif() - if(JSONTOOLKIT_JSON AND JSONTOOLKIT_JSONPOINTER) add_subdirectory(src/jsonpointer) endif() @@ -104,10 +98,6 @@ if(JSONTOOLKIT_TESTS) add_subdirectory(test/json) endif() - if(JSONTOOLKIT_JSON AND JSONTOOLKIT_REGEX) - add_subdirectory(test/regex) - endif() - if(JSONTOOLKIT_JSON AND JSONTOOLKIT_JSONPOINTER) add_subdirectory(test/jsonpointer) endif() diff --git a/DEPENDENCIES b/DEPENDENCIES index 9db96a7f3..1c722d3dc 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -1,5 +1,5 @@ vendorpull https://github.com/sourcemeta/vendorpull 70342aaf458e6cb80baeb5b718901075fc42ede6 -noa https://github.com/sourcemeta/noa 7f32f55327d9679bf45e5c2831e9501175ad441e +noa https://github.com/sourcemeta/noa 4fe72e795c684035712bc7ac38d96e84f62ff414 jsontestsuite https://github.com/nst/JSONTestSuite d64aefb55228d9584d3e5b2433f720ea8fd00c82 jsonschema-2020-12 https://github.com/json-schema-org/json-schema-spec 769daad75a9553562333a8937a187741cb708c72 jsonschema-2019-09 https://github.com/json-schema-org/json-schema-spec 41014ea723120ce70b314d72f863c6929d9f3cfd @@ -13,5 +13,4 @@ jsonschema-draft0 https://github.com/json-schema-org/json-schema-spec 7ea575aef8 referencing-suite https://github.com/python-jsonschema/referencing-suite 61c4cc202b1e96ed5adcaf4842a595f68d659212 jsonschema-test-suite https://github.com/json-schema-org/JSON-Schema-Test-Suite c2badb1298a8698f86dadf1aea7b44b3a894e5ac uriparser https://github.com/uriparser/uriparser bfe94f6e54d0abb5afa7bb0411940b7242cb835a -boost-regex https://github.com/boostorg/regex boost-1.86.0 yaml https://github.com/yaml/libyaml 0.2.5 diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 6b902353d..94332e376 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -4,10 +4,6 @@ if(JSONTOOLKIT_JSON) list(APPEND BENCHMARK_SOURCES json.cc) endif() -if(JSONTOOLKIT_REGEX) - list(APPEND BENCHMARK_SOURCES regex.cc) -endif() - if(JSONTOOLKIT_JSONPOINTER) list(APPEND BENCHMARK_SOURCES jsonpointer.cc) endif() @@ -24,11 +20,6 @@ if(BENCHMARK_SOURCES) PRIVATE sourcemeta::jsontoolkit::json) endif() - if(JSONTOOLKIT_REGEX) - target_link_libraries(sourcemeta_jsontoolkit_benchmark - PRIVATE sourcemeta::jsontoolkit::regex) - endif() - if(JSONTOOLKIT_JSONPOINTER) target_link_libraries(sourcemeta_jsontoolkit_benchmark PRIVATE sourcemeta::jsontoolkit::jsonpointer) diff --git a/config.cmake.in b/config.cmake.in index b47094866..3bc5bc283 100644 --- a/config.cmake.in +++ b/config.cmake.in @@ -6,7 +6,6 @@ list(APPEND JSONTOOLKIT_COMPONENTS ${jsontoolkit_FIND_COMPONENTS}) if(NOT JSONTOOLKIT_COMPONENTS) list(APPEND JSONTOOLKIT_COMPONENTS uri) list(APPEND JSONTOOLKIT_COMPONENTS json) - list(APPEND JSONTOOLKIT_COMPONENTS regex) list(APPEND JSONTOOLKIT_COMPONENTS jsonl) list(APPEND JSONTOOLKIT_COMPONENTS jsonpointer) list(APPEND JSONTOOLKIT_COMPONENTS jsonschema) @@ -22,10 +21,6 @@ foreach(component ${JSONTOOLKIT_COMPONENTS}) elseif(component STREQUAL "json") find_dependency(noa) include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_jsontoolkit_json.cmake") - elseif(component STREQUAL "regex") - include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_jsontoolkit_json.cmake") - find_dependency(BoostRegex) - include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_jsontoolkit_regex.cmake") elseif(component STREQUAL "jsonl") include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_jsontoolkit_json.cmake") include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_jsontoolkit_jsonl.cmake") diff --git a/doxygen/index.markdown b/doxygen/index.markdown index a01817cac..0c49c9b6a 100644 --- a/doxygen/index.markdown +++ b/doxygen/index.markdown @@ -86,7 +86,6 @@ CMake |-----------------------------------|---------|---------|-------------------------------------------------------| | `JSONTOOLKIT_URI` | Boolean | `ON` | Build the JSON Toolkit URI library | | `JSONTOOLKIT_JSON` | Boolean | `ON` | Build the JSON Toolkit JSON library | -| `JSONTOOLKIT_REGEX` | Boolean | `ON` | Build the JSON Toolkit Regex library | | `JSONTOOLKIT_JSONSCHEMA` | Boolean | `ON` | Build the JSON Toolkit JSON Schema library | | `JSONTOOLKIT_JSONPOINTER` | Boolean | `ON` | Build the JSON Toolkit JSON Pointer library | | `JSONTOOLKIT_JSONL` | Boolean | `ON` | Build the JSON Toolkit JSONL library | diff --git a/src/regex/CMakeLists.txt b/src/regex/CMakeLists.txt deleted file mode 100644 index 7eea6f2d8..000000000 --- a/src/regex/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -noa_library(NAMESPACE sourcemeta PROJECT jsontoolkit NAME regex - FOLDER "JSON Toolkit/Regex" - SOURCES regex.cc) - -target_link_libraries(sourcemeta_jsontoolkit_regex - PUBLIC sourcemeta::jsontoolkit::json) -target_link_libraries(sourcemeta_jsontoolkit_regex - PUBLIC Boost::regex) - -if(JSONTOOLKIT_INSTALL) - noa_library_install(NAMESPACE sourcemeta PROJECT jsontoolkit NAME regex) -endif() diff --git a/src/regex/include/sourcemeta/jsontoolkit/regex.h b/src/regex/include/sourcemeta/jsontoolkit/regex.h deleted file mode 100644 index f422f1c0e..000000000 --- a/src/regex/include/sourcemeta/jsontoolkit/regex.h +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef SOURCEMETA_JSONTOOLKIT_REGEX_H_ -#define SOURCEMETA_JSONTOOLKIT_REGEX_H_ - -#ifndef SOURCEMETA_JSONTOOLKIT_REGEX_EXPORT -#include -#endif - -#include - -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdocumentation" -#pragma clang diagnostic ignored "-Wsign-conversion" -#pragma clang diagnostic ignored "-Wshorten-64-to-32" -#elif defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wconversion" -#endif -#include -#if defined(__clang__) -#pragma clang diagnostic pop -#elif defined(__GNUC__) -#pragma GCC diagnostic pop -#endif - -#include // std::uint8_t, std::uint64_t -#include // std::optional -#include // std::regex -#include // std::pair -#include // std::variant - -/// @defgroup regex Regex -/// @brief An ECMA-262 regex library for use with other JSON libraries -/// -/// This functionality is included as follows: -/// -/// ```cpp -/// #include -/// ``` - -namespace sourcemeta::jsontoolkit { - -/// @ingroup regex -using RegexTypeBoost = boost::regex; - -/// @ingroup regex -using RegexTypePrefix = JSON::String; - -/// @ingroup regex -struct RegexTypeNonEmpty {}; - -/// @ingroup regex -using RegexTypeRange = std::pair; - -/// @ingroup regex -using RegexTypeStd = std::regex; - -/// @ingroup regex -struct RegexTypeNoop {}; - -/// @ingroup regex -using Regex = std::variant; -#if !defined(DOXYGEN) -// For fast internal dispatching. It must stay in sync with the variant above -enum class RegexIndex : std::uint8_t { - Boost = 0, - Prefix, - NonEmpty, - Range, - Std, - Noop -}; -#endif - -/// @ingroup regex -/// -/// Compile a regular expression from a string. If the regular expression is -/// invalid, no value is returned. For example: -/// -/// ```cpp -/// #include -/// #include -/// -/// const sourcemeta::jsontoolkit::Regex regex{ -/// sourcemeta::jsontoolkit::to_regex("^foo")}; -/// assert(regex.has_value()); -/// ``` -SOURCEMETA_JSONTOOLKIT_REGEX_EXPORT -auto to_regex(const JSON::String &pattern) -> std::optional; - -/// @ingroup regex -/// -/// Validate a string against a regular expression. For example: -/// -/// ```cpp -/// #include -/// #include -/// -/// const sourcemeta::jsontoolkit::Regex regex{ -/// sourcemeta::jsontoolkit::to_regex("^foo")}; -/// assert(regex.has_value()); -/// assert(sourcemeta::jsontoolkit::matches(regex.value(), "foo bar")); -/// ``` -SOURCEMETA_JSONTOOLKIT_REGEX_EXPORT -auto matches(const Regex ®ex, const JSON::String &value) -> bool; - -} // namespace sourcemeta::jsontoolkit - -#endif diff --git a/src/regex/regex.cc b/src/regex/regex.cc deleted file mode 100644 index e6893cb49..000000000 --- a/src/regex/regex.cc +++ /dev/null @@ -1,98 +0,0 @@ -#include - -#include // assert -#include // std::stoull - -namespace sourcemeta::jsontoolkit { - -auto to_regex(const JSON::String &pattern) -> std::optional { - if (pattern == ".*" || pattern == "^.*$" || pattern == "^(.*)$" || - pattern == "(.*)" || pattern == "[\\s\\S]*" || pattern == "^[\\s\\S]*$") { - return RegexTypeNoop{}; - } else if (pattern == ".+" || pattern == "^.+$" || pattern == "^(.+)$" || - pattern == ".") { - return RegexTypeNonEmpty{}; - } - - const std::regex PREFIX_REGEX{R"(^\^([a-zA-Z0-9-_/@]+)(\.\*)?)"}; - std::smatch matches_prefix; - if (std::regex_match(pattern, matches_prefix, PREFIX_REGEX)) { - return RegexTypePrefix{matches_prefix[1].str()}; - } - - const std::regex RANGE_REGEX{R"(^\^\.\{(\d+),(\d+)\}\$$)"}; - std::smatch matches_range; - if (std::regex_match(pattern, matches_range, RANGE_REGEX)) { - const std::uint64_t minimum{std::stoull(matches_range[1].str())}; - const std::uint64_t maximum{std::stoull(matches_range[2].str())}; - assert(minimum <= maximum); - return RegexTypeRange{minimum, maximum}; - } - - boost::regex result{ - pattern, - boost::regex::no_except | - // See https://en.cppreference.com/w/cpp/regex/basic_regex/constants - boost::regex::ECMAScript | - - // When performing matches, all marked sub-expressions (expr) are - // treated as non-marking sub-expressions (?:expr) - boost::regex::nosubs | - - // Instructs the regular expression engine to make matching faster, - // with the potential cost of making construction slower - boost::regex::optimize}; - - // Returns zero if the expression contains a valid regular expression - // See - // https://www.boost.org/doc/libs/1_82_0/libs/regex/doc/html/boost_regex/ref/basic_regex.html - if (result.status() == 0) { - return result; - } - - try { - // Boost seems to sometimes be overly strict, so we still default to - // the standard implementation - return std::regex{ - pattern, - // See https://en.cppreference.com/w/cpp/regex/basic_regex/constants - std::regex::ECMAScript | - - // When performing matches, all marked sub-expressions (expr) are - // treated as non-marking sub-expressions (?:expr) - std::regex::nosubs | - - // Instructs the regular expression engine to make matching - // faster, with the potential cost of making construction slower - std::regex::optimize}; - } catch (const std::regex_error &) { - return std::nullopt; - } -} - -auto matches(const Regex ®ex, const JSON::String &value) -> bool { - switch (static_cast(regex.index())) { - case RegexIndex::Boost: - return boost::regex_search(value, *std::get_if(®ex)); - case RegexIndex::Prefix: - return value.starts_with(*std::get_if(®ex)); - case RegexIndex::NonEmpty: - return !value.empty(); - case RegexIndex::Range: - return value.size() >= std::get_if(®ex)->first && - value.size() <= std::get_if(®ex)->second; - case RegexIndex::Std: - return std::regex_search(value, *std::get_if(®ex)); - case RegexIndex::Noop: - return true; - } - - // See https://en.cppreference.com/w/cpp/utility/unreachable -#if defined(_MSC_VER) && !defined(__clang__) - __assume(false); -#else - __builtin_unreachable(); -#endif -} - -} // namespace sourcemeta::jsontoolkit diff --git a/test/packaging/find_package/CMakeLists.txt b/test/packaging/find_package/CMakeLists.txt index 8f93ae79c..1b0282dd3 100644 --- a/test/packaging/find_package/CMakeLists.txt +++ b/test/packaging/find_package/CMakeLists.txt @@ -5,7 +5,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) find_package(JSONToolkit REQUIRED) add_executable(jsontoolkit_hello hello.cc) -target_link_libraries(jsontoolkit_hello PRIVATE sourcemeta::jsontoolkit::regex) target_link_libraries(jsontoolkit_hello PRIVATE sourcemeta::jsontoolkit::uri) target_link_libraries(jsontoolkit_hello PRIVATE sourcemeta::jsontoolkit::json) target_link_libraries(jsontoolkit_hello PRIVATE sourcemeta::jsontoolkit::jsonschema) diff --git a/test/packaging/find_package/hello.cc b/test/packaging/find_package/hello.cc index 680c80ed6..0306f9eb1 100644 --- a/test/packaging/find_package/hello.cc +++ b/test/packaging/find_package/hello.cc @@ -2,7 +2,6 @@ #include #include #include -#include #include #include diff --git a/test/regex/CMakeLists.txt b/test/regex/CMakeLists.txt deleted file mode 100644 index 273a6a316..000000000 --- a/test/regex/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -noa_googletest(NAMESPACE sourcemeta PROJECT jsontoolkit NAME regex - FOLDER "JSON Toolkit/Regex" - SOURCES - regex_to_regex_test.cc - regex_matches_test.cc) - -target_link_libraries(sourcemeta_jsontoolkit_regex_unit - PRIVATE sourcemeta::jsontoolkit::regex) -target_compile_definitions(sourcemeta_jsontoolkit_regex_unit - PRIVATE TEST_DIRECTORY="${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/test/regex/regex_matches_test.cc b/test/regex/regex_matches_test.cc deleted file mode 100644 index 7bc86b72f..000000000 --- a/test/regex/regex_matches_test.cc +++ /dev/null @@ -1,128 +0,0 @@ -#include - -#include - -TEST(Regex_matches, match_true_1) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^foo")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "foobar")); -} - -TEST(Regex_matches, match_true_2) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^.*$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "foobar")); -} - -TEST(Regex_matches, match_true_3) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^(.*)$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "foobar")); -} - -TEST(Regex_matches, match_true_4) { - const auto regex{sourcemeta::jsontoolkit::to_regex(".*")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "foobar")); -} - -TEST(Regex_matches, match_true_5) { - const auto regex{sourcemeta::jsontoolkit::to_regex(".+")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "foobar")); -} - -TEST(Regex_matches, match_true_6) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^/.*")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "/foo/bar")); -} - -TEST(Regex_matches, match_true_7) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^/.*")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "/")); -} - -TEST(Regex_matches, match_true_8) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^.{1,256}$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "foo")); -} - -TEST(Regex_matches, match_true_9) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^.{1,256}$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "f")); -} - -TEST(Regex_matches, match_true_10) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^.{1,256}$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE( - sourcemeta::jsontoolkit::matches(regex.value(), std::string(256, 'x'))); -} - -TEST(Regex_matches, match_true_11) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^@")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "@foo")); -} - -TEST(Regex_matches, match_true_12) { - const auto regex{sourcemeta::jsontoolkit::to_regex("o$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "foo")); -} - -TEST(Regex_matches, match_true_13) { - const auto regex{ - sourcemeta::jsontoolkit::to_regex("^[a-z][a-z0-9-_]{1,63}$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE(sourcemeta::jsontoolkit::matches(regex.value(), "abcd")); -} - -TEST(Regex_matches, match_true_14) { - const auto regex{sourcemeta::jsontoolkit::to_regex( - "^(?:@[0-9a-z-_.]+\\/)?[a-z][0-9a-z-_.]*$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_TRUE( - sourcemeta::jsontoolkit::matches(regex.value(), "@namespace/mypackage")); -} - -TEST(Regex_matches, match_false_1) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^foo")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_FALSE(sourcemeta::jsontoolkit::matches(regex.value(), "bar")); -} - -TEST(Regex_matches, match_false_2) { - const auto regex{sourcemeta::jsontoolkit::to_regex(".+")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_FALSE(sourcemeta::jsontoolkit::matches(regex.value(), "")); -} - -TEST(Regex_matches, match_false_3) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^/.*")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_FALSE(sourcemeta::jsontoolkit::matches(regex.value(), "foo/bar")); -} - -TEST(Regex_matches, match_false_4) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^.{1,256}$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_FALSE( - sourcemeta::jsontoolkit::matches(regex.value(), std::string(257, 'x'))); -} - -TEST(Regex_matches, match_false_5) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^@")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_FALSE(sourcemeta::jsontoolkit::matches(regex.value(), "foo")); -} - -TEST(Regex_matches, match_false_6) { - const auto regex{sourcemeta::jsontoolkit::to_regex("o$")}; - EXPECT_TRUE(regex.has_value()); - EXPECT_FALSE(sourcemeta::jsontoolkit::matches(regex.value(), "bar")); -} diff --git a/test/regex/regex_to_regex_test.cc b/test/regex/regex_to_regex_test.cc deleted file mode 100644 index 2eee85094..000000000 --- a/test/regex/regex_to_regex_test.cc +++ /dev/null @@ -1,13 +0,0 @@ -#include - -#include - -TEST(Regex_to_regex, valid_1) { - const auto regex{sourcemeta::jsontoolkit::to_regex("^foo")}; - EXPECT_TRUE(regex.has_value()); -} - -TEST(Regex_to_regex, invalid_1) { - const auto regex{sourcemeta::jsontoolkit::to_regex("(abc")}; - EXPECT_FALSE(regex.has_value()); -} diff --git a/vendor/noa/CMakeLists.txt b/vendor/noa/CMakeLists.txt index 33c530b1a..6705d15e0 100644 --- a/vendor/noa/CMakeLists.txt +++ b/vendor/noa/CMakeLists.txt @@ -7,9 +7,11 @@ include(noa) # Options option(NOA_HASH "Build the Noa Hash library" ON) option(NOA_FLAT_MAP "Build the Noa Flat Map library" ON) +option(NOA_REGEX "Build the Noa Regex library" ON) option(NOA_GOOGLETEST "Build the Google Test library" ON) option(NOA_GOOGLEBENCHMARK "Build the Google Benchmark library" ON) option(NOA_TESTS "Build the Noa tests" OFF) +option(NOA_BENCHMARK "Build the Noa benchmarks" OFF) option(NOA_INSTALL "Install the Noa library" ON) option(NOA_ADDRESS_SANITIZER "Build Noa with an address sanitizer" OFF) option(NOA_UNDEFINED_SANITIZER "Build Noa with an undefined behavior sanitizer" OFF) @@ -35,10 +37,15 @@ if(NOA_HASH) add_subdirectory(src/hash) endif() -if(NOA_HASH AND NOA_FLAT_MAP) +if(NOA_FLAT_MAP) add_subdirectory(src/flat_map) endif() +if(NOA_REGEX) + find_package(BoostRegex REQUIRED) + add_subdirectory(src/regex) +endif() + if(NOA_GOOGLETEST) find_package(GoogleTest REQUIRED) endif() @@ -51,6 +58,7 @@ endif() if(PROJECT_IS_TOP_LEVEL) noa_target_clang_format(SOURCES + benchmark/*.h benchmark/*.cc src/*.h src/*.cc test/*.h test/*.cc) noa_target_clang_tidy(SOURCES @@ -64,14 +72,18 @@ if(NOA_TESTS AND NOA_GOOGLETEST) add_subdirectory(test/hash) endif() - if(NOA_HASH AND NOA_FLAT_MAP) + if(NOA_FLAT_MAP) add_subdirectory(test/flat_map) endif() + if(NOA_REGEX) + add_subdirectory(test/regex) + endif() + if(PROJECT_IS_TOP_LEVEL) # Otherwise we need the child project to link # against the sanitizers too. - if(NOT JSONTOOLKIT_ADDRESS_SANITIZER AND NOT JSONTOOLKIT_UNDEFINED_SANITIZER) + if(NOT NOA_ADDRESS_SANITIZER AND NOT NOA_UNDEFINED_SANITIZER) add_subdirectory(test/packaging) endif() endif() @@ -80,3 +92,7 @@ endif() if(NOA_GOOGLEBENCHMARK) find_package(GoogleBenchmark REQUIRED) endif() + +if(NOA_BENCHMARK AND NOA_GOOGLEBENCHMARK) + add_subdirectory(benchmark) +endif() diff --git a/vendor/noa/benchmark/CMakeLists.txt b/vendor/noa/benchmark/CMakeLists.txt new file mode 100644 index 000000000..d9ed6cc87 --- /dev/null +++ b/vendor/noa/benchmark/CMakeLists.txt @@ -0,0 +1,36 @@ +set(BENCHMARK_SOURCES) + +if(NOA_REGEX) + list(APPEND BENCHMARK_SOURCES regex.cc) +endif() + +if(BENCHMARK_SOURCES) + noa_googlebenchmark(NAMESPACE sourcemeta PROJECT noa + FOLDER "Noa" SOURCES ${BENCHMARK_SOURCES}) + + target_compile_definitions(sourcemeta_noa_benchmark + PRIVATE CURRENT_DIRECTORY="${CMAKE_CURRENT_SOURCE_DIR}") + + if(NOA_REGEX) + target_link_libraries(sourcemeta_noa_benchmark + PRIVATE sourcemeta::noa::regex) + endif() + + add_custom_target(benchmark_all + COMMAND sourcemeta_noa_benchmark + DEPENDS sourcemeta_noa_benchmark + COMMENT "Running benchmark...") + add_custom_target(benchmark_json + COMMAND sourcemeta_noa_benchmark + --benchmark_format=json + --benchmark_out="${PROJECT_BINARY_DIR}/benchmark.json" + DEPENDS sourcemeta_noa_benchmark + COMMENT "Running benchmark...") +else() + add_custom_target(benchmark_all VERBATIM + COMMAND "${CMAKE_COMMAND}" -E echo "Nothing to benchmark" + COMMAND "${CMAKE_COMMAND}" -E false) + add_custom_target(benchmark_json VERBATIM + COMMAND "${CMAKE_COMMAND}" -E echo "Nothing to benchmark" + COMMAND "${CMAKE_COMMAND}" -E false) +endif() diff --git a/benchmark/regex.cc b/vendor/noa/benchmark/regex.cc similarity index 82% rename from benchmark/regex.cc rename to vendor/noa/benchmark/regex.cc index 0517873a9..7cfdbfaad 100644 --- a/benchmark/regex.cc +++ b/vendor/noa/benchmark/regex.cc @@ -1,15 +1,17 @@ #include #include // assert +#include // std::string -#include +#include -#define BENCHMARK_REGEX(name, pattern, string) \ +#define BENCHMARK_REGEX(name, pattern, input) \ static void name(benchmark::State &state) { \ - const auto regex{sourcemeta::jsontoolkit::to_regex(pattern)}; \ + const auto regex{sourcemeta::noa::to_regex(pattern)}; \ assert(regex.has_value()); \ for (auto _ : state) { \ - auto result{sourcemeta::jsontoolkit::matches(regex.value(), string)}; \ + auto result{ \ + sourcemeta::noa::matches(regex.value(), input)}; \ assert(result); \ benchmark::DoNotOptimize(result); \ } \ diff --git a/cmake/FindBoostRegex.cmake b/vendor/noa/cmake/FindBoostRegex.cmake similarity index 94% rename from cmake/FindBoostRegex.cmake rename to vendor/noa/cmake/FindBoostRegex.cmake index 28c214fa9..0c8b27249 100644 --- a/cmake/FindBoostRegex.cmake +++ b/vendor/noa/cmake/FindBoostRegex.cmake @@ -137,39 +137,39 @@ if(NOT BoostRegex_FOUND) PRIVATE_HEADER "${BOOST_REGEX_PRIVATE_HEADERS}" EXPORT_NAME boost_regex) - if(JSONTOOLKIT_INSTALL) + if(NOA_INSTALL) include(GNUInstallDirs) install(TARGETS boost_regex EXPORT boost_regex PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/boost" - COMPONENT sourcemeta_jsontoolkit + COMPONENT sourcemeta_noa PRIVATE_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/boost" - COMPONENT sourcemeta_jsontoolkit + COMPONENT sourcemeta_noa RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - COMPONENT sourcemeta_jsontoolkit + COMPONENT sourcemeta_noa LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - COMPONENT sourcemeta_jsontoolkit - NAMELINK_COMPONENT sourcemeta_jsontoolkit_dev + COMPONENT sourcemeta_noa + NAMELINK_COMPONENT sourcemeta_noa_dev ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - COMPONENT sourcemeta_jsontoolkit_dev) + COMPONENT sourcemeta_noa_dev) install(FILES ${BOOST_REGEX_PRIVATE_HEADERS_REGEX} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/boost/regex" - COMPONENT sourcemeta_jsontoolkit) + COMPONENT sourcemeta_noa) install(FILES ${BOOST_REGEX_PRIVATE_HEADERS_REGEX_CONFIG} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/boost/regex/config" - COMPONENT sourcemeta_jsontoolkit) + COMPONENT sourcemeta_noa) install(FILES ${BOOST_REGEX_PRIVATE_HEADERS_REGEX_PENDING} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/boost/regex/pending" - COMPONENT sourcemeta_jsontoolkit) + COMPONENT sourcemeta_noa) install(FILES ${BOOST_REGEX_PRIVATE_HEADERS_REGEX_V4} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/boost/regex/v4" - COMPONENT sourcemeta_jsontoolkit) + COMPONENT sourcemeta_noa) install(FILES ${BOOST_REGEX_PRIVATE_HEADERS_REGEX_V5} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/boost/regex/v5" - COMPONENT sourcemeta_jsontoolkit) + COMPONENT sourcemeta_noa) install(EXPORT boost_regex DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/boostregex" - COMPONENT sourcemeta_jsontoolkit_dev) + COMPONENT sourcemeta_noa_dev) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/boostregex-config.cmake "include(\"\${CMAKE_CURRENT_LIST_DIR}/boost_regex.cmake\")\n" @@ -177,7 +177,7 @@ if(NOT BoostRegex_FOUND) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/boostregex-config.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/boostregex" - COMPONENT sourcemeta_jsontoolkit_dev) + COMPONENT sourcemeta_noa_dev) endif() set(BoostRegex_FOUND ON) diff --git a/vendor/noa/config.cmake.in b/vendor/noa/config.cmake.in index 2a8e653e2..ef5baf7f9 100644 --- a/vendor/noa/config.cmake.in +++ b/vendor/noa/config.cmake.in @@ -6,13 +6,19 @@ list(APPEND NOA_COMPONENTS ${noa_FIND_COMPONENTS}) if(NOT NOA_COMPONENTS) list(APPEND NOA_COMPONENTS hash) list(APPEND NOA_COMPONENTS flat_map) + list(APPEND NOA_COMPONENTS regex) endif() +include(CMakeFindDependencyMacro) + foreach(component ${NOA_COMPONENTS}) if(component STREQUAL "hash") include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_noa_hash.cmake") elseif(component STREQUAL "flat_map") include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_noa_flat_map.cmake") + elseif(component STREQUAL "regex") + find_dependency(BoostRegex) + include("${CMAKE_CURRENT_LIST_DIR}/sourcemeta_noa_regex.cmake") else() message(FATAL_ERROR "Unknown Noa component: ${component}") endif() diff --git a/vendor/noa/src/regex/CMakeLists.txt b/vendor/noa/src/regex/CMakeLists.txt new file mode 100644 index 000000000..9a5c81685 --- /dev/null +++ b/vendor/noa/src/regex/CMakeLists.txt @@ -0,0 +1,10 @@ +include(noa) + +noa_library(NAMESPACE sourcemeta PROJECT noa NAME regex + FOLDER "Noa/Regex") + +if(NOA_INSTALL) + noa_library_install(NAMESPACE sourcemeta PROJECT noa NAME regex) +endif() + +target_link_libraries(sourcemeta_noa_regex INTERFACE Boost::regex) diff --git a/vendor/noa/src/regex/include/sourcemeta/noa/regex.h b/vendor/noa/src/regex/include/sourcemeta/noa/regex.h new file mode 100644 index 000000000..71569c713 --- /dev/null +++ b/vendor/noa/src/regex/include/sourcemeta/noa/regex.h @@ -0,0 +1,191 @@ +#ifndef SOURCEMETA_NOA_REGEX_H_ +#define SOURCEMETA_NOA_REGEX_H_ + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdocumentation" +#pragma clang diagnostic ignored "-Wsign-conversion" +#pragma clang diagnostic ignored "-Wshorten-64-to-32" +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#endif +#include +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#include // assert +#include // std::uint8_t, std::uint64_t +#include // std::optional +#include // std::regex +#include // std::stoull +#include // std::pair +#include // std::variant + +/// @defgroup regex Regex + +namespace sourcemeta::noa { + +/// @ingroup regex +template using RegexTypeBoost = boost::basic_regex; + +/// @ingroup regex +template using RegexTypePrefix = T; + +/// @ingroup regex +struct RegexTypeNonEmpty {}; + +/// @ingroup regex +using RegexTypeRange = std::pair; + +/// @ingroup regex +template using RegexTypeStd = std::basic_regex; + +/// @ingroup regex +struct RegexTypeNoop {}; + +/// @ingroup regex +template +using Regex = + std::variant, RegexTypePrefix, + RegexTypeNonEmpty, RegexTypeRange, + RegexTypeStd, RegexTypeNoop>; +#if !defined(DOXYGEN) +// For fast internal dispatching. It must stay in sync with the variant above +enum class RegexIndex : std::uint8_t { + Boost = 0, + Prefix, + NonEmpty, + Range, + Std, + Noop +}; +#endif + +/// @ingroup regex +/// +/// Compile a regular expression from a string. If the regular expression is +/// invalid, no value is returned. For example: +/// +/// ```cpp +/// #include +/// #include +/// +/// const sourcemeta::noa::Regex regex{ +/// sourcemeta::noa::to_regex("^foo")}; +/// assert(regex.has_value()); +/// ``` +template +auto to_regex(const T &pattern) -> std::optional> { + if (pattern == ".*" || pattern == "^.*$" || pattern == "^(.*)$" || + pattern == "(.*)" || pattern == "[\\s\\S]*" || pattern == "^[\\s\\S]*$") { + return RegexTypeNoop{}; + } else if (pattern == ".+" || pattern == "^.+$" || pattern == "^(.+)$" || + pattern == ".") { + return RegexTypeNonEmpty{}; + } + + const std::regex PREFIX_REGEX{R"(^\^([a-zA-Z0-9-_/@]+)(\.\*)?)"}; + std::smatch matches_prefix; + if (std::regex_match(pattern, matches_prefix, PREFIX_REGEX)) { + return RegexTypePrefix{matches_prefix[1].str()}; + } + + const std::regex RANGE_REGEX{R"(^\^\.\{(\d+),(\d+)\}\$$)"}; + std::smatch matches_range; + if (std::regex_match(pattern, matches_range, RANGE_REGEX)) { + const std::uint64_t minimum{std::stoull(matches_range[1].str())}; + const std::uint64_t maximum{std::stoull(matches_range[2].str())}; + assert(minimum <= maximum); + return RegexTypeRange{minimum, maximum}; + } + + RegexTypeBoost result{ + pattern, + boost::regex::no_except | + // See https://en.cppreference.com/w/cpp/regex/basic_regex/constants + boost::regex::ECMAScript | + + // When performing matches, all marked sub-expressions (expr) are + // treated as non-marking sub-expressions (?:expr) + boost::regex::nosubs | + + // Instructs the regular expression engine to make matching faster, + // with the potential cost of making construction slower + boost::regex::optimize}; + + // Returns zero if the expression contains a valid regular expression + // See + // https://www.boost.org/doc/libs/1_82_0/libs/regex/doc/html/boost_regex/ref/basic_regex.html + if (result.status() == 0) { + return result; + } + + try { + // Boost seems to sometimes be overly strict, so we still default to + // the standard implementation + return RegexTypeStd{ + pattern, + // See https://en.cppreference.com/w/cpp/regex/basic_regex/constants + std::regex::ECMAScript | + + // When performing matches, all marked sub-expressions (expr) are + // treated as non-marking sub-expressions (?:expr) + std::regex::nosubs | + + // Instructs the regular expression engine to make matching + // faster, with the potential cost of making construction slower + std::regex::optimize}; + } catch (const std::regex_error &) { + return std::nullopt; + } +} + +/// @ingroup regex +/// +/// Validate a string against a regular expression. For example: +/// +/// ```cpp +/// #include +/// #include +/// +/// const sourcemeta::noa::Regex regex{ +/// sourcemeta::noa::to_regex("^foo")}; +/// assert(regex.has_value()); +/// assert(sourcemeta::noa::matches(regex.value(), "foo bar")); +/// ``` +template +auto matches(const Regex ®ex, const T &value) -> bool { + switch (static_cast(regex.index())) { + case RegexIndex::Boost: + return boost::regex_search( + value, *std::get_if>(®ex)); + case RegexIndex::Prefix: + return value.starts_with(*std::get_if>(®ex)); + case RegexIndex::NonEmpty: + return !value.empty(); + case RegexIndex::Range: + return value.size() >= std::get_if(®ex)->first && + value.size() <= std::get_if(®ex)->second; + case RegexIndex::Std: + return std::regex_search( + value, *std::get_if>(®ex)); + case RegexIndex::Noop: + return true; + } + + // See https://en.cppreference.com/w/cpp/utility/unreachable +#if defined(_MSC_VER) && !defined(__clang__) + __assume(false); +#else + __builtin_unreachable(); +#endif +} + +} // namespace sourcemeta::noa + +#endif diff --git a/vendor/boost-regex.mask b/vendor/noa/vendor/boost-regex.mask similarity index 100% rename from vendor/boost-regex.mask rename to vendor/noa/vendor/boost-regex.mask diff --git a/vendor/boost-regex/include/boost/cregex.hpp b/vendor/noa/vendor/boost-regex/include/boost/cregex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/cregex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/cregex.hpp diff --git a/vendor/boost-regex/include/boost/regex.h b/vendor/noa/vendor/boost-regex/include/boost/regex.h similarity index 100% rename from vendor/boost-regex/include/boost/regex.h rename to vendor/noa/vendor/boost-regex/include/boost/regex.h diff --git a/vendor/boost-regex/include/boost/regex.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex.hpp diff --git a/vendor/boost-regex/include/boost/regex/concepts.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/concepts.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/concepts.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/concepts.hpp diff --git a/vendor/boost-regex/include/boost/regex/config.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/config.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/config.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/config.hpp diff --git a/vendor/boost-regex/include/boost/regex/config/borland.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/config/borland.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/config/borland.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/config/borland.hpp diff --git a/vendor/boost-regex/include/boost/regex/config/cwchar.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/config/cwchar.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/config/cwchar.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/config/cwchar.hpp diff --git a/vendor/boost-regex/include/boost/regex/icu.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/icu.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/icu.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/icu.hpp diff --git a/vendor/boost-regex/include/boost/regex/mfc.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/mfc.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/mfc.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/mfc.hpp diff --git a/vendor/boost-regex/include/boost/regex/pattern_except.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/pattern_except.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/pattern_except.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/pattern_except.hpp diff --git a/vendor/boost-regex/include/boost/regex/pending/object_cache.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/pending/object_cache.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/pending/object_cache.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/pending/object_cache.hpp diff --git a/vendor/boost-regex/include/boost/regex/pending/static_mutex.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/pending/static_mutex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/pending/static_mutex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/pending/static_mutex.hpp diff --git a/vendor/boost-regex/include/boost/regex/pending/unicode_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/pending/unicode_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/pending/unicode_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/pending/unicode_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/user.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/user.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/user.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/user.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/basic_regex.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/basic_regex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/basic_regex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/basic_regex.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/basic_regex_creator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/basic_regex_creator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/basic_regex_creator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/basic_regex_creator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/basic_regex_parser.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/basic_regex_parser.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/basic_regex_parser.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/basic_regex_parser.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/c_regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/c_regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/c_regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/c_regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/char_regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/char_regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/char_regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/char_regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/cpp_regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/cpp_regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/cpp_regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/cpp_regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/cregex.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/cregex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/cregex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/cregex.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/error_type.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/error_type.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/error_type.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/error_type.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/icu.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/icu.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/icu.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/icu.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/indexed_bit_flag.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/indexed_bit_flag.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/indexed_bit_flag.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/indexed_bit_flag.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/iterator_category.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/iterator_category.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/iterator_category.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/iterator_category.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/iterator_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/iterator_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/iterator_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/iterator_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/match_flags.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/match_flags.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/match_flags.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/match_flags.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/match_results.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/match_results.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/match_results.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/match_results.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/mem_block_cache.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/mem_block_cache.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/mem_block_cache.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/mem_block_cache.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/object_cache.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/object_cache.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/object_cache.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/object_cache.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/pattern_except.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/pattern_except.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/pattern_except.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/pattern_except.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/perl_matcher.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/perl_matcher.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/perl_matcher.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/perl_matcher.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/perl_matcher_common.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/perl_matcher_common.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/perl_matcher_common.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/perl_matcher_common.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/perl_matcher_non_recursive.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/perl_matcher_non_recursive.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/perl_matcher_non_recursive.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/perl_matcher_non_recursive.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/perl_matcher_recursive.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/perl_matcher_recursive.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/perl_matcher_recursive.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/perl_matcher_recursive.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/primary_transform.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/primary_transform.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/primary_transform.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/primary_transform.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/protected_call.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/protected_call.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/protected_call.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/protected_call.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regbase.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regbase.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regbase.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regbase.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_format.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_format.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_format.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_format.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_fwd.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_fwd.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_fwd.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_fwd.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_grep.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_grep.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_grep.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_grep.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_match.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_match.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_match.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_match.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_merge.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_merge.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_merge.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_merge.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_raw_buffer.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_raw_buffer.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_raw_buffer.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_raw_buffer.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_replace.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_replace.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_replace.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_replace.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_search.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_search.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_search.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_search.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_split.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_split.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_split.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_split.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_token_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_token_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_token_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_token_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_traits_defaults.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_traits_defaults.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_traits_defaults.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_traits_defaults.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/regex_workaround.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_workaround.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/regex_workaround.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/regex_workaround.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/states.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/states.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/states.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/states.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/sub_match.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/sub_match.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/sub_match.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/sub_match.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/syntax_type.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/syntax_type.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/syntax_type.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/syntax_type.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/u32regex_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/u32regex_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/u32regex_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/u32regex_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/u32regex_token_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/u32regex_token_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/u32regex_token_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/u32regex_token_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/unicode_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/unicode_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/unicode_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/unicode_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v4/w32_regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v4/w32_regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v4/w32_regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v4/w32_regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/basic_regex.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/basic_regex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/basic_regex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/basic_regex.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/basic_regex_creator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/basic_regex_creator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/basic_regex_creator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/basic_regex_creator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/basic_regex_parser.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/basic_regex_parser.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/basic_regex_parser.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/basic_regex_parser.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/c_regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/c_regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/c_regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/c_regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/char_regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/char_regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/char_regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/char_regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/cpp_regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/cpp_regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/cpp_regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/cpp_regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/cregex.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/cregex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/cregex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/cregex.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/error_type.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/error_type.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/error_type.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/error_type.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/icu.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/icu.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/icu.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/icu.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/iterator_category.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/iterator_category.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/iterator_category.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/iterator_category.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/iterator_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/iterator_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/iterator_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/iterator_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/match_flags.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/match_flags.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/match_flags.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/match_flags.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/match_results.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/match_results.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/match_results.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/match_results.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/mem_block_cache.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/mem_block_cache.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/mem_block_cache.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/mem_block_cache.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/object_cache.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/object_cache.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/object_cache.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/object_cache.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/pattern_except.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/pattern_except.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/pattern_except.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/pattern_except.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/perl_matcher.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/perl_matcher.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/perl_matcher.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/perl_matcher.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/perl_matcher_common.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/perl_matcher_common.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/perl_matcher_common.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/perl_matcher_common.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/perl_matcher_non_recursive.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/perl_matcher_non_recursive.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/perl_matcher_non_recursive.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/perl_matcher_non_recursive.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/primary_transform.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/primary_transform.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/primary_transform.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/primary_transform.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regbase.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regbase.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regbase.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regbase.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_format.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_format.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_format.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_format.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_fwd.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_fwd.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_fwd.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_fwd.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_grep.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_grep.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_grep.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_grep.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_match.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_match.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_match.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_match.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_merge.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_merge.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_merge.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_merge.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_raw_buffer.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_raw_buffer.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_raw_buffer.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_raw_buffer.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_replace.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_replace.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_replace.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_replace.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_search.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_search.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_search.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_search.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_split.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_split.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_split.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_split.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_token_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_token_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_token_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_token_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_traits_defaults.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_traits_defaults.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_traits_defaults.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_traits_defaults.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/regex_workaround.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_workaround.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/regex_workaround.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/regex_workaround.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/states.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/states.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/states.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/states.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/sub_match.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/sub_match.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/sub_match.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/sub_match.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/syntax_type.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/syntax_type.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/syntax_type.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/syntax_type.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/u32regex_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/u32regex_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/u32regex_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/u32regex_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/u32regex_token_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/u32regex_token_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/u32regex_token_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/u32regex_token_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/unicode_iterator.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/unicode_iterator.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/unicode_iterator.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/unicode_iterator.hpp diff --git a/vendor/boost-regex/include/boost/regex/v5/w32_regex_traits.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex/v5/w32_regex_traits.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex/v5/w32_regex_traits.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex/v5/w32_regex_traits.hpp diff --git a/vendor/boost-regex/include/boost/regex_fwd.hpp b/vendor/noa/vendor/boost-regex/include/boost/regex_fwd.hpp similarity index 100% rename from vendor/boost-regex/include/boost/regex_fwd.hpp rename to vendor/noa/vendor/boost-regex/include/boost/regex_fwd.hpp