diff --git a/.travis.yml b/.travis.yml index 840eabe..08de4ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ matrix: - os: linux language: cpp compiler: gcc - env: COMPILER="g++-5" + env: COMPILER="g++-5" CXX_STANDARD=11 addons: apt: sources: @@ -16,7 +16,7 @@ matrix: - os: linux language: cpp compiler: gcc - env: COMPILER="g++-6" + env: COMPILER="g++-6" CXX_STANDARD=11 addons: apt: sources: @@ -27,7 +27,7 @@ matrix: - os: linux language: cpp compiler: gcc - env: COMPILER="g++-7" + env: COMPILER="g++-7" CXX_STANDARD=11 addons: apt: sources: @@ -38,7 +38,18 @@ matrix: - os: linux language: cpp compiler: gcc - env: COMPILER="g++-8" + env: COMPILER="g++-8" CXX_STANDARD=11 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-8 + - libboost-all-dev + - os: linux + language: cpp + compiler: gcc + env: COMPILER="g++-8" CXX_STANDARD=17 addons: apt: sources: @@ -49,7 +60,7 @@ matrix: - os: linux language: cpp compiler: clang - env: COMPILER="clang++-3.7" + env: COMPILER="clang++-3.7" CXX_STANDARD=11 addons: apt: sources: @@ -61,7 +72,7 @@ matrix: - os: linux language: cpp compiler: clang - env: COMPILER="clang++-4.0" + env: COMPILER="clang++-4.0" CXX_STANDARD=11 addons: apt: sources: @@ -73,7 +84,7 @@ matrix: - os: linux language: cpp compiler: clang - env: COMPILER="clang++-5.0" + env: COMPILER="clang++-5.0" CXX_STANDARD=11 addons: apt: sources: @@ -85,7 +96,7 @@ matrix: - os: linux language: cpp compiler: clang - env: COMPILER="clang++-6.0" + env: COMPILER="clang++-6.0" CXX_STANDARD=11 addons: apt: sources: @@ -97,7 +108,7 @@ matrix: - os: linux language: cpp compiler: clang - env: COMPILER="clang++-7" + env: COMPILER="clang++-7" CXX_STANDARD=11 addons: apt: sources: @@ -109,7 +120,7 @@ matrix: - os: linux language: cpp compiler: clang - env: COMPILER="clang++-8" + env: COMPILER="clang++-8" CXX_STANDARD=11 addons: apt: sources: @@ -118,14 +129,38 @@ matrix: packages: - clang-8 - libboost-all-dev + - os: linux + language: cpp + compiler: clang + env: COMPILER="clang++-8" CXX_STANDARD=17 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-8 + packages: + - clang-8 + - g++-8 + - libboost-all-dev - os: osx language: cpp compiler: clang + env: CXX_STANDARD=11 script: +- | + if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then + mkdir -p cmake + travis_retry wget "https://cmake.org/files/v3.11/cmake-3.11.2-Linux-x86_64.tar.gz" + tar xf cmake-3.11.2-Linux-x86_64.tar.gz -C cmake --strip-components=1 + export PATH=${TRAVIS_BUILD_DIR}/cmake/bin:${PATH} + else + brew upgrade cmake + fi +- cmake --version - mkdir build - cd build - git clone https://github.com/toml-lang/toml.git -- cmake -DCMAKE_CXX_COMPILER=$COMPILER .. +- cmake -DCMAKE_CXX_COMPILER=$COMPILER -DCMAKE_CXX_STANDARD=$CXX_STANDARD .. - make - ctest --output-on-failure diff --git a/CMakeLists.txt b/CMakeLists.txt index 05dbef1..f76b700 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,10 @@ project(toml11) include(CheckCXXCompilerFlag) if("${CMAKE_VERSION}" VERSION_GREATER 3.1) - set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_EXTENSIONS OFF) + if(NOT DEFINED CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 11) + endif() set(CXX_STANDARD_REQUIRED ON) else() # Manually check for C++11 compiler flag. diff --git a/README.md b/README.md index 685446d..c292af1 100644 --- a/README.md +++ b/README.md @@ -188,6 +188,12 @@ See also [underlying types](#underlying-types). NOTE: To enable to get a reference, conversions between Float and Integer are not supported. +After C++17, you can use `std::string_view` to get a string from a `toml::value`. + +```cpp +const auto sv = toml::get(tab.at("key")); +``` + ### In the case of type error If you pass an invalid type to `toml::get`, `toml::type_error` will be thrown. diff --git a/tests/test_get.cpp b/tests/test_get.cpp index b9c5941..833c479 100644 --- a/tests/test_get.cpp +++ b/tests/test_get.cpp @@ -12,6 +12,9 @@ #include #include #include +#if __cplusplus >= 201703L +#include +#endif BOOST_AUTO_TEST_CASE(test_get_exact) @@ -166,6 +169,17 @@ BOOST_AUTO_TEST_CASE(test_get_string_type) toml::get(v) += "bar"; BOOST_CHECK_EQUAL("foobar", toml::get(v)); } + +#if __cplusplus >= 201703L + { + toml::value v("foo", toml::string_t::basic); + BOOST_CHECK_EQUAL("foo", toml::get(v)); + } + { + toml::value v("foo", toml::string_t::literal); + BOOST_CHECK_EQUAL("foo", toml::get(v)); + } +#endif } BOOST_AUTO_TEST_CASE(test_get_toml_array) diff --git a/tests/test_value.cpp b/tests/test_value.cpp index a0b38e4..2faaa99 100644 --- a/tests/test_value.cpp +++ b/tests/test_value.cpp @@ -9,6 +9,11 @@ #include #include +#if __cplusplus >= 201703L +#include +#endif + + BOOST_AUTO_TEST_CASE(test_value_boolean) { toml::value v1(true); @@ -355,6 +360,25 @@ BOOST_AUTO_TEST_CASE(test_value_string) BOOST_CHECK_EQUAL(v1.cast(), true); BOOST_CHECK_EQUAL(v2.cast(), true); BOOST_CHECK_EQUAL(v3.cast(), true); + +#if __cplusplus >= 201703L + std::string_view sv = "foo"; + + toml::value v7(sv); + toml::value v8(sv, toml::string_t::literal); + + BOOST_CHECK_EQUAL(v7.type(), toml::value_t::String); + BOOST_CHECK_EQUAL(v8.type(), toml::value_t::String); + BOOST_CHECK(v7.is(toml::value_t::String)); + BOOST_CHECK(v8.is(toml::value_t::String)); + BOOST_CHECK(v7.is()); + BOOST_CHECK(v8.is()); + BOOST_CHECK(v7.is_string()); + BOOST_CHECK(v8.is_string()); + + BOOST_CHECK_EQUAL(v7.cast(), "foo"); + BOOST_CHECK_EQUAL(v8.cast(), "foo"); +#endif } BOOST_AUTO_TEST_CASE(test_value_local_date) diff --git a/toml/get.hpp b/toml/get.hpp index c0e47bb..344519f 100644 --- a/toml/get.hpp +++ b/toml/get.hpp @@ -108,6 +108,18 @@ inline std::string get(value&& v) return std::move(v.cast().str); } +// ============================================================================ +// std::string_view + +#if __cplusplus >= 201703L +template::value, std::nullptr_t>::type = nullptr> +inline std::string_view get(const value& v) +{ + return std::string_view(v.cast().str); +} +#endif + // ============================================================================ // std::chrono::duration from toml::local_time. diff --git a/toml/string.hpp b/toml/string.hpp index 89e6d39..abd58b5 100644 --- a/toml/string.hpp +++ b/toml/string.hpp @@ -4,6 +4,11 @@ #define TOML11_STRING_HPP #include #include +#if __cplusplus >= 201703L +#if __has_include() +#include +#endif +#endif namespace toml { @@ -40,6 +45,17 @@ struct string operator std::string const& () const& noexcept {return str;} operator std::string&& () && noexcept {return std::move(str);} +#if __cplusplus >= 201703L + explicit string(std::string_view s): kind(string_t::basic), str(s){} + string(std::string_view s, string_t k): kind(k), str(s){} + + string& operator=(std::string_view s) + {kind = string_t::basic; str = s; return *this;} + + explicit operator std::string_view() const noexcept + {return std::string_view(str);} +#endif + string_t kind; std::string str; }; diff --git a/toml/types.hpp b/toml/types.hpp index db93320..b879176 100644 --- a/toml/types.hpp +++ b/toml/types.hpp @@ -7,6 +7,11 @@ #include "traits.hpp" #include #include +#if __cplusplus >= 201703L +#if __has_include() +#include +#endif +#endif namespace toml { @@ -172,6 +177,9 @@ template struct is_container : conjunction< negation>, negation>, +#if __cplusplus >= 201703L + negation>, +#endif has_iterator, has_value_type >{}; diff --git a/toml/value.hpp b/toml/value.hpp index 9af4040..9fa88dc 100644 --- a/toml/value.hpp +++ b/toml/value.hpp @@ -14,6 +14,9 @@ #include #include #include +#if __cplusplus >= 201703L +#include +#endif namespace toml { @@ -293,6 +296,29 @@ class value assigner(this->string_, toml::string(std::string(s), kind)); } +#if __cplusplus >= 201703L + value(std::string_view s) + : type_(value_t::String), + region_info_(std::make_shared(region_base{})) + { + assigner(this->string_, toml::string(s)); + } + value& operator=(std::string_view s) + { + this->cleanup(); + this->type_ = value_t::String; + this->region_info_ = std::make_shared(region_base{}); + assigner(this->string_, toml::string(s)); + return *this; + } + value(std::string_view s, string_t kind) + : type_(value_t::String), + region_info_(std::make_shared(region_base{})) + { + assigner(this->string_, toml::string(s, kind)); + } +#endif + // local date =========================================================== value(const local_date& ld)