wide_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 162 行
CPP
162 行
// Boost wide_test.cpp -----------------------------------------------------//// Copyright Beman Dawes 2005// Use, modification, and distribution is subject to the Boost Software// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)// See library home page at http://www.boost.org/libs/filesystem#include <boost/config/warning_disable.hpp>// See deprecated_test for tests of deprecated features#define BOOST_FILESYSTEM_NO_DEPRECATED#include <boost/filesystem/config.hpp># ifdef BOOST_FILESYSTEM_NARROW_ONLY# error This compiler or standard library does not support wide-character strings or paths# endif#include <boost/filesystem/operations.hpp>#include <boost/filesystem/fstream.hpp>#include <boost/scoped_array.hpp>#include <boost/test/minimal.hpp>#include "../src/utf8_codecvt_facet.hpp"namespace fs = boost::filesystem;#include <iostream>#include <iomanip>#include <ios>#include <string>#include <cerrno>#include "lpath.hpp"namespace{ bool cleanup = true; template< class Path > void create_file( const Path & ph, const std::string & contents ) { // TODO: why missing symbol error on Darwin# ifndef __APPLE__ fs::ofstream f( ph );# else std::ofstream f( ph.external_file_string().c_str() );# endif if ( !f ) throw fs::basic_filesystem_error<Path>( "wide_test create_file", ph, boost::system::error_code( errno, boost::system::errno_ecat ) ); if ( !contents.empty() ) f << contents; } template< class Path > void test( const Path & dir, const Path & file, const Path & dot ) { Path tmp; tmp = file; BOOST_CHECK( tmp == file ); tmp = file.string(); BOOST_CHECK( tmp == file ); tmp = file.string().c_str(); BOOST_CHECK( tmp == file ); fs::initial_path<Path>(); fs::current_path<Path>(); fs::remove( dir / file ); fs::remove( dir ); BOOST_CHECK( !fs::exists( dir / file ) ); BOOST_CHECK( !fs::exists( dir ) ); BOOST_CHECK( fs::create_directory( dir ) ); BOOST_CHECK( fs::exists( dir ) ); BOOST_CHECK( fs::is_directory( dir ) ); BOOST_CHECK( fs::is_empty( dir ) ); create_file( dir / file, "wide_test file contents" ); BOOST_CHECK( fs::exists( dir / file ) ); BOOST_CHECK( !fs::is_directory( dir / file ) ); BOOST_CHECK( !fs::is_empty( dir / file ) ); BOOST_CHECK( fs::file_size( dir / file ) == 23 || fs::file_size( dir / file ) == 24 ); BOOST_CHECK( fs::equivalent( dir / file, dot / dir / file ) ); BOOST_CHECK( fs::last_write_time( dir / file ) ); typedef fs::basic_directory_iterator<Path> it_t; int count(0); for ( it_t it( dir ); it != it_t(); ++it ) { BOOST_CHECK( it->path() == dir / file ); BOOST_CHECK( !fs::is_empty( it->path() ) ); ++count; } BOOST_CHECK( count == 1 ); if ( cleanup ) { fs::remove( dir / file ); fs::remove( dir ); } } // test boost::detail::utf8_codecvt_facet - even though it is not used by // Boost.Filesystem on Windows, early detection of problems is worthwhile. std::string to_external( const std::wstring & src ) { fs::detail::utf8_codecvt_facet convertor; std::size_t work_size( convertor.max_length() * (src.size()+1) ); boost::scoped_array<char> work( new char[ work_size ] ); std::mbstate_t state; const wchar_t * from_next; char * to_next; if ( convertor.out( state, src.c_str(), src.c_str()+src.size(), from_next, work.get(), work.get()+work_size, to_next ) != std::codecvt_base::ok ) boost::throw_exception( std::runtime_error("to_external conversion error") ); *to_next = '\0'; return std::string( work.get() ); }} // unnamed namespace// test_main ---------------------------------------------------------------//int test_main( int argc, char * /*argv*/[] ){ if ( argc > 1 ) cleanup = false; // So that tests are run with known encoding, use Boost UTF-8 codecvt std::locale global_loc = std::locale(); std::locale loc( global_loc, new fs::detail::utf8_codecvt_facet ); fs::wpath_traits::imbue( loc ); std::string s( to_external( L"\x2780" ) ); for (std::size_t i = 0; i < s.size(); ++i ) std::cout << std::hex << int( static_cast<unsigned char>(s[i]) ) << " "; std::cout << std::dec << std::endl; BOOST_CHECK( to_external( L"\x2780" ).size() == 3 ); BOOST_CHECK( to_external( L"\x2780" ) == "\xE2\x9E\x80" ); // test fs::path std::cout << "begin path test..." << std::endl; test( fs::path( "foo" ), fs::path( "bar" ), fs::path( "." ) ); std::cout << "complete\n\n"; // test fs::wpath // x2780 is circled 1 against white background == e2 9e 80 in UTF-8 // x2781 is circled 2 against white background == e2 9e 81 in UTF-8 std::cout << "begin wpath test..." << std::endl; test( fs::wpath( L"\x2780" ), fs::wpath( L"\x2781" ), fs::wpath( L"." ) ); std::cout << "complete\n\n"; // test user supplied basic_path const long dir[] = { 'b', 'o', 'o', 0 }; const long file[] = { 'f', 'a', 'r', 0 }; const long dot[] = { '.', 0 }; std::cout << "begin lpath test..." << std::endl; test( ::user::lpath( dir ), ::user::lpath( file ), ::user::lpath( dot ) ); std::cout << "complete\n\n"; return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?