mirror of
https://git.mirrors.martin98.com/https://github.com/gulrak/filesystem
synced 2025-07-23 23:24:26 +08:00
#3: Added missing inlines and small refactorings for compiler errors when including in multiple files. Added a test.
This commit is contained in:
parent
d9348942fc
commit
f756027cca
24
filesystem.h
24
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;
|
// 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!
|
// Generating debugging and shrinking my own DFA from scratch was a day of fun!
|
||||||
enum utf8_states_t { S_STRT = 0, S_RJCT = 8 };
|
enum utf8_states_t { S_STRT = 0, S_RJCT = 8 };
|
||||||
static const uint32_t utf8_state_info[] = {
|
inline unsigned consumeUtf8Fragment(const unsigned state, const uint8_t fragment, uint32_t& codepoint)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
|
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;
|
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);
|
codepoint = (state ? (codepoint << 6) | (fragment & 0x3f) : (0xff >> category) & fragment);
|
||||||
return state == S_RJCT ? static_cast<unsigned>(S_RJCT) : static_cast<unsigned>((utf8_state_info[category + 16] >> (state << 2)) & 0xf);
|
return state == S_RJCT ? static_cast<unsigned>(S_RJCT) : static_cast<unsigned>((utf8_state_info[category + 16] >> (state << 2)) & 0xf);
|
||||||
@ -1971,7 +1971,7 @@ inline const path::string_type& path::native() const
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const path::value_type* path::c_str() const
|
inline const path::value_type* path::c_str() const
|
||||||
{
|
{
|
||||||
return native().c_str();
|
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)
|
: _type(other._type)
|
||||||
, _perms(other._perms)
|
, _perms(other._perms)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
file_status::file_status(file_status&& other) noexcept
|
inline file_status::file_status(file_status&& other) noexcept
|
||||||
: _type(other._type)
|
: _type(other._type)
|
||||||
, _perms(other._perms)
|
, _perms(other._perms)
|
||||||
{
|
{
|
||||||
@ -3940,14 +3940,14 @@ file_status::file_status(file_status&& other) noexcept
|
|||||||
inline file_status::~file_status() {}
|
inline file_status::~file_status() {}
|
||||||
|
|
||||||
// assignments:
|
// 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;
|
_type = rhs._type;
|
||||||
_perms = rhs._perms;
|
_perms = rhs._perms;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
file_status& file_status::operator=(file_status&& rhs) noexcept
|
inline file_status& file_status::operator=(file_status&& rhs) noexcept
|
||||||
{
|
{
|
||||||
_type = rhs._type;
|
_type = rhs._type;
|
||||||
_perms = rhs._perms;
|
_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
|
// 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;
|
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();
|
return recursive_directory_iterator();
|
||||||
}
|
}
|
||||||
|
@ -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_options(std_filesystem_test PRIVATE "/Zc:__cplusplus")
|
||||||
target_compile_definitions(std_filesystem_test PRIVATE USE_STD_FS _CRT_SECURE_NO_WARNINGS)
|
target_compile_definitions(std_filesystem_test PRIVATE USE_STD_FS _CRT_SECURE_NO_WARNINGS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_executable(multifile_test multi1.cpp multi2.cpp ../filesystem.h catch.hpp)
|
||||||
|
50
test/multi1.cpp
Normal file
50
test/multi1.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
//---------------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Copyright (c) 2018, Steffen Schümann <s.schuemann@pobox.com>
|
||||||
|
// 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()));
|
||||||
|
}
|
48
test/multi2.cpp
Normal file
48
test/multi2.cpp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
//---------------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Copyright (c) 2018, Steffen Schümann <s.schuemann@pobox.com>
|
||||||
|
// 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()));
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user