From f756027ccaba60021822cfd4062d198b26971ba0 Mon Sep 17 00:00:00 2001 From: gulrak Date: Mon, 5 Nov 2018 20:38:43 +0100 Subject: [PATCH] #3: Added missing inlines and small refactorings for compiler errors when including in multiple files. Added a test. --- filesystem.h | 24 +++++++++++----------- test/CMakeLists.txt | 2 ++ test/multi1.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++ test/multi2.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 test/multi1.cpp create mode 100644 test/multi2.cpp diff --git a/filesystem.h b/filesystem.h index c706fce..a722f9f 100644 --- a/filesystem.h +++ b/filesystem.h @@ -1087,12 +1087,12 @@ inline void appendUTF8(std::string& str, uint32_t unicode) // and Taylor R Campbell for the ideas to this DFA approach of UTF-8 decoding; // Generating debugging and shrinking my own DFA from scratch was a day of fun! enum utf8_states_t { S_STRT = 0, S_RJCT = 8 }; -static const uint32_t utf8_state_info[] = { - 0x11111111u, 0x11111111u, 0x77777777u, 0x77777777u, 0x88888888u, 0x88888888u, 0x88888888u, 0x88888888u, 0x22222299u, 0x22222222u, 0x22222222u, 0x22222222u, 0x3333333au, 0x33433333u, - 0x9995666bu, 0x99999999u, 0x88888880u, 0x22818108u, 0x88888881u, 0x88888882u, 0x88888884u, 0x88888887u, 0x88888886u, 0x82218108u, 0x82281108u, 0x88888888u, 0x88888883u, 0x88888885u, -}; -static inline unsigned consumeUtf8Fragment(const unsigned state, const uint8_t fragment, uint32_t& codepoint) +inline unsigned consumeUtf8Fragment(const unsigned state, const uint8_t fragment, uint32_t& codepoint) { + static const uint32_t utf8_state_info[] = { + 0x11111111u, 0x11111111u, 0x77777777u, 0x77777777u, 0x88888888u, 0x88888888u, 0x88888888u, 0x88888888u, 0x22222299u, 0x22222222u, 0x22222222u, 0x22222222u, 0x3333333au, 0x33433333u, + 0x9995666bu, 0x99999999u, 0x88888880u, 0x22818108u, 0x88888881u, 0x88888882u, 0x88888884u, 0x88888887u, 0x88888886u, 0x82218108u, 0x82281108u, 0x88888888u, 0x88888883u, 0x88888885u, + }; uint8_t category = fragment < 128 ? 0 : (utf8_state_info[(fragment >> 3) & 0xf] >> ((fragment & 7) << 2)) & 0xf; codepoint = (state ? (codepoint << 6) | (fragment & 0x3f) : (0xff >> category) & fragment); return state == S_RJCT ? static_cast(S_RJCT) : static_cast((utf8_state_info[category + 16] >> (state << 2)) & 0xf); @@ -1971,7 +1971,7 @@ inline const path::string_type& path::native() const #endif } -const path::value_type* path::c_str() const +inline const path::value_type* path::c_str() const { return native().c_str(); } @@ -3925,13 +3925,13 @@ inline file_status::file_status(file_type ft, perms prms) noexcept { } -file_status::file_status(const file_status& other) noexcept +inline file_status::file_status(const file_status& other) noexcept : _type(other._type) , _perms(other._perms) { } -file_status::file_status(file_status&& other) noexcept +inline file_status::file_status(file_status&& other) noexcept : _type(other._type) , _perms(other._perms) { @@ -3940,14 +3940,14 @@ file_status::file_status(file_status&& other) noexcept inline file_status::~file_status() {} // assignments: -file_status& file_status::operator=(const file_status& rhs) noexcept +inline file_status& file_status::operator=(const file_status& rhs) noexcept { _type = rhs._type; _perms = rhs._perms; return *this; } -file_status& file_status::operator=(file_status&& rhs) noexcept +inline file_status& file_status::operator=(file_status&& rhs) noexcept { _type = rhs._type; _perms = rhs._perms; @@ -4724,12 +4724,12 @@ inline void recursive_directory_iterator::swap(recursive_directory_iterator& rhs } // 30.10.14.2 directory_iterator non-member functions -recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept +inline recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept { return iter; } -recursive_directory_iterator end(const recursive_directory_iterator&) noexcept +inline recursive_directory_iterator end(const recursive_directory_iterator&) noexcept { return recursive_directory_iterator(); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b3a0c6f..42a49ad 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -31,3 +31,5 @@ if(CMAKE_CXX_COMPILER_ID MATCHES MSVC AND (CMAKE_CXX_COMPILER_VERSION VERSION_EQ target_compile_options(std_filesystem_test PRIVATE "/Zc:__cplusplus") target_compile_definitions(std_filesystem_test PRIVATE USE_STD_FS _CRT_SECURE_NO_WARNINGS) endif() + +add_executable(multifile_test multi1.cpp multi2.cpp ../filesystem.h catch.hpp) diff --git a/test/multi1.cpp b/test/multi1.cpp new file mode 100644 index 0000000..9aee76b --- /dev/null +++ b/test/multi1.cpp @@ -0,0 +1,50 @@ +//--------------------------------------------------------------------------------------- +// +// Copyright (c) 2018, Steffen Schümann +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +//--------------------------------------------------------------------------------------- +#define CATCH_CONFIG_MAIN +#include "catch.hpp" + +#include "../filesystem.h" +namespace fs = ghc::filesystem; + +// This test and the one in multi2.cpp doesn't actualy test relevant functionality, +// it is just used to check that it is possible to include filesystem.h in multiple +// source files. +TEST_CASE("Multifile-test 1", "[multi]") +{ + CHECK("/usr/local/bin" == fs::path("/usr/local/bin").generic_string()); + std::string str = "/usr/local/bin"; + std::u16string u16str = u"/usr/local/bin"; + std::u32string u32str = U"/usr/local/bin"; + CHECK(str == fs::path(str.begin(), str.end())); + CHECK(str == fs::path(u16str.begin(), u16str.end())); + CHECK(str == fs::path(u32str.begin(), u32str.end())); +} diff --git a/test/multi2.cpp b/test/multi2.cpp new file mode 100644 index 0000000..55c8013 --- /dev/null +++ b/test/multi2.cpp @@ -0,0 +1,48 @@ +//--------------------------------------------------------------------------------------- +// +// Copyright (c) 2018, Steffen Schümann +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +//--------------------------------------------------------------------------------------- +#include "catch.hpp" +#include "../filesystem.h" +namespace fs = ghc::filesystem; + +// This test and the one in multi1.cpp doesn't actualy test relevant functionality, +// it is just used to check that it is possible to include filesystem.h in multiple +// source files. +TEST_CASE("Multifile-test 2", "[multi]") +{ + CHECK("/usr/local/bin" == fs::path("/usr/local/bin").generic_string()); + std::string str = "/usr/local/bin"; + std::u16string u16str = u"/usr/local/bin"; + std::u32string u32str = U"/usr/local/bin"; + CHECK(str == fs::path(str.begin(), str.end())); + CHECK(str == fs::path(u16str.begin(), u16str.end())); + CHECK(str == fs::path(u32str.begin(), u32str.end())); +}