From 92d8471e6e7259c5d9fbe41326014ce6321980f9 Mon Sep 17 00:00:00 2001 From: Edoardo Lolletti Date: Sun, 1 Sep 2024 01:52:27 +0200 Subject: [PATCH] Remove nonstd::string_view Use stl's --- gframe/CGUISkinSystem/CGUISkinSystem.cpp | 2 +- gframe/data_manager.cpp | 4 +- gframe/data_manager.h | 2 +- gframe/deck_manager.cpp | 2 +- gframe/edopro_main.cpp | 2 +- gframe/game.cpp | 12 +- gframe/gframe.cpp | 2 +- gframe/image_downloader.cpp | 6 +- gframe/image_manager.cpp | 96 +- gframe/nonstd/string_view.hpp | 1684 ---------------------- gframe/sound_manager.cpp | 54 +- gframe/text_types.h | 8 +- gframe/utils.cpp | 4 +- gframe/utils_gui.cpp | 2 +- gframe/windbot.cpp | 2 +- 15 files changed, 98 insertions(+), 1784 deletions(-) delete mode 100644 gframe/nonstd/string_view.hpp diff --git a/gframe/CGUISkinSystem/CGUISkinSystem.cpp b/gframe/CGUISkinSystem/CGUISkinSystem.cpp index 5729f10b7..6037671c6 100644 --- a/gframe/CGUISkinSystem/CGUISkinSystem.cpp +++ b/gframe/CGUISkinSystem/CGUISkinSystem.cpp @@ -352,7 +352,7 @@ void CGUISkinSystem::loadCustomColors(gui::CImageGUISkin * skin) { #include "../custom_skin_enum.inl" #undef DECLR }; - constexpr auto wtmp = L"Skin/Custom/"_sv; + constexpr auto wtmp = L"Skin/Custom/"sv; auto* children = registry->listNodeChildren(L"", wtmp.data()); if(!children) return; diff --git a/gframe/data_manager.cpp b/gframe/data_manager.cpp index 16ad26228..dcc8911e8 100644 --- a/gframe/data_manager.cpp +++ b/gframe/data_manager.cpp @@ -14,11 +14,11 @@ namespace ygo { constexpr epro::wstringview DataManager::unknown_string; static constexpr auto SELECT_STMT = R"(SELECT datas.id,datas.ot,datas.alias,datas.setcode,datas.type,datas.atk,datas.def,datas.level,datas.race,datas.attribute,datas.category,texts.name,texts.desc,texts.str1,texts.str2,texts.str3,texts.str4,texts.str5,texts.str6,texts.str7,texts.str8,texts.str9,texts.str10,texts.str11,texts.str12,texts.str13,texts.str14,texts.str15,texts.str16 -FROM datas,texts WHERE texts.id = datas.id ORDER BY texts.id;)"_sv; +FROM datas,texts WHERE texts.id = datas.id ORDER BY texts.id;)"sv; static constexpr auto SELECT_STMT_LOCALE = R"(SELECT id,name,desc,str1,str2,str3,str4,str5,str6,str7,str8,str9,str10,str11,str12,str13,str14,str15,str16 -FROM texts ORDER BY texts.id;)"_sv; +FROM texts ORDER BY texts.id;)"sv; DataManager::DataManager() : irrvfs(irrsqlite_createfilesystem()) { if(sqlite3_threadsafe()) diff --git a/gframe/data_manager.h b/gframe/data_manager.h index 0ef8abf28..648585ea8 100644 --- a/gframe/data_manager.h +++ b/gframe/data_manager.h @@ -170,7 +170,7 @@ class DataManager { std::unordered_map cards; - static constexpr auto unknown_string = L"???"_sv; + static constexpr auto unknown_string = L"???"sv; static void CardReader(void* payload, uint32_t code, OCG_CardData* data); static bool deck_sort_lv(const CardDataC* l1, const CardDataC* l2); static bool deck_sort_atk(const CardDataC* l1, const CardDataC* l2); diff --git a/gframe/deck_manager.cpp b/gframe/deck_manager.cpp index 75e9ec906..93a23bf29 100644 --- a/gframe/deck_manager.cpp +++ b/gframe/deck_manager.cpp @@ -30,7 +30,7 @@ void DeckManager::ClearDummies() { dummy_entries.clear(); } bool DeckManager::LoadLFListSingle(const epro::path_string& path) { - static constexpr auto key = "$whitelist"_sv; + static constexpr auto key = "$whitelist"sv; FileStream infile{ path, FileStream::in }; if(infile.fail()) return false; diff --git a/gframe/edopro_main.cpp b/gframe/edopro_main.cpp index e4db4a6ec..e02047f18 100644 --- a/gframe/edopro_main.cpp +++ b/gframe/edopro_main.cpp @@ -34,7 +34,7 @@ auto GetOption(epro::path_stringview option) { default: return LAUNCH_PARAM::COUNT; } } - if(option == EPRO_TEXT("i-want-to-be-admin"_sv)) + if(option == EPRO_TEXT("i-want-to-be-admin"sv)) return LAUNCH_PARAM::WANTS_TO_RUN_AS_ADMIN; return LAUNCH_PARAM::COUNT; } diff --git a/gframe/game.cpp b/gframe/game.cpp index 66a5e71ff..8a32f2d55 100644 --- a/gframe/game.cpp +++ b/gframe/game.cpp @@ -1146,19 +1146,19 @@ void Game::LoadCoreFromRepos() { #endif static constexpr std::pair supported_graphic_drivers[]{ - { L"Default"_sv, irr::video::EDT_COUNT}, + { L"Default"sv, irr::video::EDT_COUNT}, #if !EDOPRO_ANDROID && !EDOPRO_IOS - { L"OpenGL"_sv, irr::video::EDT_OPENGL }, + { L"OpenGL"sv, irr::video::EDT_OPENGL }, #endif #if EDOPRO_WINDOWS - { L"Direct3D 9"_sv, irr::video::EDT_DIRECT3D9}, + { L"Direct3D 9"sv, irr::video::EDT_DIRECT3D9}, #if (IRRLICHT_VERSION_MAJOR==1 && IRRLICHT_VERSION_MINOR==9) - { L"Direct3D 9on12"_sv, irr::video::EDT_DIRECT3D9_ON_12}, + { L"Direct3D 9on12"sv, irr::video::EDT_DIRECT3D9_ON_12}, #endif #endif #if !EDOPRO_MACOS && (IRRLICHT_VERSION_MAJOR==1 && IRRLICHT_VERSION_MINOR==9) - { L"OpenGL ES 1"_sv, irr::video::EDT_OGLES1 }, - { L"OpenGL ES 2"_sv, irr::video::EDT_OGLES2 }, + { L"OpenGL ES 1"sv, irr::video::EDT_OGLES1 }, + { L"OpenGL ES 2"sv, irr::video::EDT_OGLES2 }, #endif }; diff --git a/gframe/gframe.cpp b/gframe/gframe.cpp index 2d31e31d8..369ed624d 100644 --- a/gframe/gframe.cpp +++ b/gframe/gframe.cpp @@ -111,7 +111,7 @@ int edopro_main(const args_t& args) { if(ygo::Utils::IsRunningAsAdmin() && !args[LAUNCH_PARAM::WANTS_TO_RUN_AS_ADMIN].enabled) { constexpr auto err = "Attempted to run the game as " ADMIN_STR ".\n" "You should NEVER have to run the game with elevated priviledges.\n" - "If for some reason you REALLY want to do that, launch the game with the option \"-i-want-to-be-admin\""_sv; + "If for some reason you REALLY want to do that, launch the game with the option \"-i-want-to-be-admin\""sv; epro::print("{}\n", err); ygo::GUIUtils::ShowErrorWindow("Initialization fail", err); return EXIT_FAILURE; diff --git a/gframe/image_downloader.cpp b/gframe/image_downloader.cpp index 16bbc7f32..11d889403 100644 --- a/gframe/image_downloader.cpp +++ b/gframe/image_downloader.cpp @@ -123,16 +123,16 @@ void ImageDownloader::DownloadPic() { switch(type) { case imgType::ART: case imgType::THUMB: { - dest = EPRO_TEXT("./pics/{}"_sv); + dest = EPRO_TEXT("./pics/{}"sv); break; } case imgType::FIELD: { - dest = EPRO_TEXT("./pics/field/{}"_sv); + dest = EPRO_TEXT("./pics/field/{}"sv); name.append(EPRO_TEXT("_f")); break; } case imgType::COVER: { - dest = EPRO_TEXT("./pics/cover/{}"_sv); + dest = EPRO_TEXT("./pics/cover/{}"sv); name.append(EPRO_TEXT("_c")); break; } diff --git a/gframe/image_manager.cpp b/gframe/image_manager.cpp index 87654ad5b..bb8fcc5b1 100644 --- a/gframe/image_manager.cpp +++ b/gframe/image_manager.cpp @@ -88,175 +88,175 @@ bool ImageManager::Initial() { timestamp_id = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); textures_path = BASE_PATH; - tCover[0] = loadTextureFixedSize(EPRO_TEXT("cover"_sv), CARD_IMG_WIDTH, CARD_IMG_HEIGHT); + tCover[0] = loadTextureFixedSize(EPRO_TEXT("cover"sv), CARD_IMG_WIDTH, CARD_IMG_HEIGHT); ASSERT_TEXTURE_LOADED(tCover[0], "cover"); - tCover[1] = loadTextureFixedSize(EPRO_TEXT("cover2"_sv), CARD_IMG_WIDTH, CARD_IMG_HEIGHT); + tCover[1] = loadTextureFixedSize(EPRO_TEXT("cover2"sv), CARD_IMG_WIDTH, CARD_IMG_HEIGHT); if(!tCover[1]) tCover[1] = tCover[0]; - tUnknown = loadTextureFixedSize(EPRO_TEXT("unknown"_sv), CARD_IMG_WIDTH, CARD_IMG_HEIGHT); + tUnknown = loadTextureFixedSize(EPRO_TEXT("unknown"sv), CARD_IMG_WIDTH, CARD_IMG_HEIGHT); ASSERT_TEXTURE_LOADED(tUnknown, "unknown"); - tAct = loadTextureAnySize(EPRO_TEXT("act"_sv)); + tAct = loadTextureAnySize(EPRO_TEXT("act"sv)); ASSERT_TEXTURE_LOADED(tAct, "act"); ASSIGN_DEFAULT(tAct); - tAttack = loadTextureAnySize(EPRO_TEXT("attack"_sv)); + tAttack = loadTextureAnySize(EPRO_TEXT("attack"sv)); ASSERT_TEXTURE_LOADED(tAttack, "attack"); ASSIGN_DEFAULT(tAttack); - tChain = loadTextureAnySize(EPRO_TEXT("chain"_sv)); + tChain = loadTextureAnySize(EPRO_TEXT("chain"sv)); ASSERT_TEXTURE_LOADED(tChain, "chain"); ASSIGN_DEFAULT(tChain); - tNegated = loadTextureFixedSize(EPRO_TEXT("negated"_sv), 128, 128); + tNegated = loadTextureFixedSize(EPRO_TEXT("negated"sv), 128, 128); ASSERT_TEXTURE_LOADED(tNegated, "negated"); ASSIGN_DEFAULT(tNegated); - tNumber = loadTextureFixedSize(EPRO_TEXT("number"_sv), 320, 256); + tNumber = loadTextureFixedSize(EPRO_TEXT("number"sv), 320, 256); ASSERT_TEXTURE_LOADED(tNumber, "number"); ASSIGN_DEFAULT(tNumber); - tLPBar = loadTextureAnySize(EPRO_TEXT("lp"_sv)); + tLPBar = loadTextureAnySize(EPRO_TEXT("lp"sv)); ASSERT_TEXTURE_LOADED(tLPBar, "lp"); ASSIGN_DEFAULT(tLPBar); - tLPFrame = loadTextureAnySize(EPRO_TEXT("lpf"_sv)); + tLPFrame = loadTextureAnySize(EPRO_TEXT("lpf"sv)); ASSERT_TEXTURE_LOADED(tLPFrame, "lpf"); ASSIGN_DEFAULT(tLPFrame); - tMask = loadTextureFixedSize(EPRO_TEXT("mask"_sv), 254, 254); + tMask = loadTextureFixedSize(EPRO_TEXT("mask"sv), 254, 254); ASSERT_TEXTURE_LOADED(tMask, "mask"); ASSIGN_DEFAULT(tMask); - tEquip = loadTextureAnySize(EPRO_TEXT("equip"_sv)); + tEquip = loadTextureAnySize(EPRO_TEXT("equip"sv)); ASSERT_TEXTURE_LOADED(tEquip, "equip"); ASSIGN_DEFAULT(tEquip); - tTarget = loadTextureAnySize(EPRO_TEXT("target"_sv)); + tTarget = loadTextureAnySize(EPRO_TEXT("target"sv)); ASSERT_TEXTURE_LOADED(tTarget, "target"); ASSIGN_DEFAULT(tTarget); - tChainTarget = loadTextureAnySize(EPRO_TEXT("chaintarget"_sv)); + tChainTarget = loadTextureAnySize(EPRO_TEXT("chaintarget"sv)); ASSERT_TEXTURE_LOADED(tChainTarget, "chaintarget"); ASSIGN_DEFAULT(tChainTarget); - tLim = loadTextureAnySize(EPRO_TEXT("lim"_sv)); + tLim = loadTextureAnySize(EPRO_TEXT("lim"sv)); ASSERT_TEXTURE_LOADED(tLim, "lim"); ASSIGN_DEFAULT(tLim); - tOT = loadTextureAnySize(EPRO_TEXT("ot"_sv)); + tOT = loadTextureAnySize(EPRO_TEXT("ot"sv)); ASSERT_TEXTURE_LOADED(tOT, "ot"); ASSIGN_DEFAULT(tOT); - tHand[0] = loadTextureFixedSize(EPRO_TEXT("f1"_sv), 89, 128); + tHand[0] = loadTextureFixedSize(EPRO_TEXT("f1"sv), 89, 128); ASSERT_TEXTURE_LOADED(tHand[0], "f1"); ASSIGN_DEFAULT(tHand[0]); - tHand[1] = loadTextureFixedSize(EPRO_TEXT("f2"_sv), 89, 128); + tHand[1] = loadTextureFixedSize(EPRO_TEXT("f2"sv), 89, 128); ASSERT_TEXTURE_LOADED(tHand[1], "f2"); ASSIGN_DEFAULT(tHand[1]); - tHand[2] = loadTextureFixedSize(EPRO_TEXT("f3"_sv), 89, 128); + tHand[2] = loadTextureFixedSize(EPRO_TEXT("f3"sv), 89, 128); ASSERT_TEXTURE_LOADED(tHand[2], "f3"); ASSIGN_DEFAULT(tHand[2]); - tBackGround = loadTextureAnySize(EPRO_TEXT("bg"_sv)); + tBackGround = loadTextureAnySize(EPRO_TEXT("bg"sv)); ASSERT_TEXTURE_LOADED(tBackGround, "bg"); ASSIGN_DEFAULT(tBackGround); - tBackGround_menu = loadTextureAnySize(EPRO_TEXT("bg_menu"_sv)); + tBackGround_menu = loadTextureAnySize(EPRO_TEXT("bg_menu"sv)); if(!tBackGround_menu) tBackGround_menu = tBackGround; ASSIGN_DEFAULT(tBackGround_menu); - tBackGround_deck = loadTextureAnySize(EPRO_TEXT("bg_deck"_sv)); + tBackGround_deck = loadTextureAnySize(EPRO_TEXT("bg_deck"sv)); if(!tBackGround_deck) tBackGround_deck = tBackGround; ASSIGN_DEFAULT(tBackGround_deck); - tBackGround_duel_topdown = loadTextureAnySize(EPRO_TEXT("bg_duel_topdown"_sv)); + tBackGround_duel_topdown = loadTextureAnySize(EPRO_TEXT("bg_duel_topdown"sv)); if(!tBackGround_duel_topdown) tBackGround_duel_topdown = tBackGround; ASSIGN_DEFAULT(tBackGround_duel_topdown); - tField[0][0] = loadTextureAnySize(EPRO_TEXT("field2"_sv)); + tField[0][0] = loadTextureAnySize(EPRO_TEXT("field2"sv)); ASSERT_TEXTURE_LOADED(tField[0][0], "field2"); ASSIGN_DEFAULT(tField[0][0]); - tFieldTransparent[0][0] = loadTextureAnySize(EPRO_TEXT("field-transparent2"_sv)); + tFieldTransparent[0][0] = loadTextureAnySize(EPRO_TEXT("field-transparent2"sv)); ASSERT_TEXTURE_LOADED(tFieldTransparent[0][0], "field-transparent2"); ASSIGN_DEFAULT(tFieldTransparent[0][0]); - tField[0][1] = loadTextureAnySize(EPRO_TEXT("field3"_sv)); + tField[0][1] = loadTextureAnySize(EPRO_TEXT("field3"sv)); ASSERT_TEXTURE_LOADED(tField[0][1], "field3"); ASSIGN_DEFAULT(tField[0][1]); - tFieldTransparent[0][1] = loadTextureAnySize(EPRO_TEXT("field-transparent3"_sv)); + tFieldTransparent[0][1] = loadTextureAnySize(EPRO_TEXT("field-transparent3"sv)); ASSERT_TEXTURE_LOADED(tFieldTransparent[0][1], "field-transparent3"); ASSIGN_DEFAULT(tFieldTransparent[0][1]); - tField[0][2] = loadTextureAnySize(EPRO_TEXT("field"_sv)); + tField[0][2] = loadTextureAnySize(EPRO_TEXT("field"sv)); ASSERT_TEXTURE_LOADED(tField[0][2], "field"); ASSIGN_DEFAULT(tField[0][2]); - tFieldTransparent[0][2] = loadTextureAnySize(EPRO_TEXT("field-transparent"_sv)); + tFieldTransparent[0][2] = loadTextureAnySize(EPRO_TEXT("field-transparent"sv)); ASSERT_TEXTURE_LOADED(tFieldTransparent[0][2], "field-transparent"); ASSIGN_DEFAULT(tFieldTransparent[0][2]); - tField[0][3] = loadTextureAnySize(EPRO_TEXT("field4"_sv)); + tField[0][3] = loadTextureAnySize(EPRO_TEXT("field4"sv)); ASSERT_TEXTURE_LOADED(tField[0][3], "field4"); ASSIGN_DEFAULT(tField[0][3]); - tFieldTransparent[0][3] = loadTextureAnySize(EPRO_TEXT("field-transparent4"_sv)); + tFieldTransparent[0][3] = loadTextureAnySize(EPRO_TEXT("field-transparent4"sv)); ASSERT_TEXTURE_LOADED(tFieldTransparent[0][3], "field-transparent4"); ASSIGN_DEFAULT(tFieldTransparent[0][3]); - tField[1][0] = loadTextureAnySize(EPRO_TEXT("fieldSP2"_sv)); + tField[1][0] = loadTextureAnySize(EPRO_TEXT("fieldSP2"sv)); ASSERT_TEXTURE_LOADED(tField[1][0], "fieldSP2"); ASSIGN_DEFAULT(tField[1][0]); - tFieldTransparent[1][0] = loadTextureAnySize(EPRO_TEXT("field-transparentSP2"_sv)); + tFieldTransparent[1][0] = loadTextureAnySize(EPRO_TEXT("field-transparentSP2"sv)); ASSERT_TEXTURE_LOADED(tFieldTransparent[1][0], "field-transparentSP2"); ASSIGN_DEFAULT(tFieldTransparent[1][0]); - tField[1][1] = loadTextureAnySize(EPRO_TEXT("fieldSP3"_sv)); + tField[1][1] = loadTextureAnySize(EPRO_TEXT("fieldSP3"sv)); ASSERT_TEXTURE_LOADED(tField[1][1], "fieldSP3"); ASSIGN_DEFAULT(tField[1][1]); - tFieldTransparent[1][1] = loadTextureAnySize(EPRO_TEXT("field-transparentSP3"_sv)); + tFieldTransparent[1][1] = loadTextureAnySize(EPRO_TEXT("field-transparentSP3"sv)); ASSERT_TEXTURE_LOADED(tFieldTransparent[1][1], "field-transparentSP3"); ASSIGN_DEFAULT(tFieldTransparent[1][1]); - tField[1][2] = loadTextureAnySize(EPRO_TEXT("fieldSP"_sv)); + tField[1][2] = loadTextureAnySize(EPRO_TEXT("fieldSP"sv)); ASSERT_TEXTURE_LOADED(tField[1][2], "fieldSP"); ASSIGN_DEFAULT(tField[1][2]); - tFieldTransparent[1][2] = loadTextureAnySize(EPRO_TEXT("field-transparentSP"_sv)); + tFieldTransparent[1][2] = loadTextureAnySize(EPRO_TEXT("field-transparentSP"sv)); ASSERT_TEXTURE_LOADED(tFieldTransparent[1][2], "field-transparentSP"); ASSIGN_DEFAULT(tFieldTransparent[1][2]); - tField[1][3] = loadTextureAnySize(EPRO_TEXT("fieldSP4"_sv)); + tField[1][3] = loadTextureAnySize(EPRO_TEXT("fieldSP4"sv)); ASSERT_TEXTURE_LOADED(tField[1][3], "fieldSP4"); ASSIGN_DEFAULT(tField[1][3]); - tFieldTransparent[1][3] = loadTextureAnySize(EPRO_TEXT("field-transparentSP4"_sv)); + tFieldTransparent[1][3] = loadTextureAnySize(EPRO_TEXT("field-transparentSP4"sv)); ASSERT_TEXTURE_LOADED(tFieldTransparent[1][3], "field-transparentSP4"); ASSIGN_DEFAULT(tFieldTransparent[1][3]); - tSettings = loadTextureAnySize(EPRO_TEXT("settings"_sv)); + tSettings = loadTextureAnySize(EPRO_TEXT("settings"sv)); ASSERT_TEXTURE_LOADED(tSettings, "settings"); ASSIGN_DEFAULT(tSettings); // Not required to be present - tCheckBox[0] = loadTextureAnySize(EPRO_TEXT("checkbox_16"_sv)); + tCheckBox[0] = loadTextureAnySize(EPRO_TEXT("checkbox_16"sv)); ASSIGN_DEFAULT(tCheckBox[0]); - tCheckBox[1] = loadTextureAnySize(EPRO_TEXT("checkbox_32"_sv)); + tCheckBox[1] = loadTextureAnySize(EPRO_TEXT("checkbox_32"sv)); ASSIGN_DEFAULT(tCheckBox[1]); - tCheckBox[2] = loadTextureAnySize(EPRO_TEXT("checkbox_64"_sv)); + tCheckBox[2] = loadTextureAnySize(EPRO_TEXT("checkbox_64"sv)); ASSIGN_DEFAULT(tCheckBox[2]); @@ -282,8 +282,8 @@ void ImageManager::replaceTextureLoadingAnySize(irr::video::ITexture*& texture, driver->removeTexture(texture); texture = tmp; } -#define REPLACE_TEXTURE_WITH_FIXED_SIZE(obj,name,w,h) replaceTextureLoadingFixedSize(obj, def_##obj, EPRO_TEXT(name) ""_sv, w, h) -#define REPLACE_TEXTURE_ANY_SIZE(obj,name) replaceTextureLoadingAnySize(obj, def_##obj, EPRO_TEXT(name) ""_sv) +#define REPLACE_TEXTURE_WITH_FIXED_SIZE(obj,name,w,h) replaceTextureLoadingFixedSize(obj, def_##obj, EPRO_TEXT(name) ""sv, w, h) +#define REPLACE_TEXTURE_ANY_SIZE(obj,name) replaceTextureLoadingAnySize(obj, def_##obj, EPRO_TEXT(name) ""sv) void ImageManager::ChangeTextures(epro::path_stringview _path) { if(_path == textures_path) @@ -449,12 +449,12 @@ void ImageManager::RefreshCovers() { return; driver->removeTexture(std::exchange(texture, new_texture)); }; - reloadTextureWithNewSizes(tCover[0], EPRO_TEXT("cover"_sv)); + reloadTextureWithNewSizes(tCover[0], EPRO_TEXT("cover"sv)); driver->removeTexture(std::exchange(tCover[1], nullptr)); - reloadTextureWithNewSizes(tCover[1], EPRO_TEXT("cover2"_sv)); + reloadTextureWithNewSizes(tCover[1], EPRO_TEXT("cover2"sv)); if(!tCover[1]) tCover[1] = tCover[0]; - reloadTextureWithNewSizes(tUnknown, EPRO_TEXT("unknown"_sv)); + reloadTextureWithNewSizes(tUnknown, EPRO_TEXT("unknown"sv)); } void ImageManager::LoadPic() { Utils::SetThreadName("PicLoader"); diff --git a/gframe/nonstd/string_view.hpp b/gframe/nonstd/string_view.hpp deleted file mode 100644 index 3b4526fe2..000000000 --- a/gframe/nonstd/string_view.hpp +++ /dev/null @@ -1,1684 +0,0 @@ -// Copyright 2017-2020 by Martin Moene -// -// string-view lite, a C++17-like string_view for C++98 and later. -// For more information see https://github.com/martinmoene/string-view-lite -// -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#pragma once - -#ifndef NONSTD_SV_LITE_H_INCLUDED -#define NONSTD_SV_LITE_H_INCLUDED - -#define string_view_lite_MAJOR 1 -#define string_view_lite_MINOR 7 -#define string_view_lite_PATCH 0 - -#define string_view_lite_VERSION nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY(string_view_lite_PATCH) - -#define nssv_STRINGIFY( x ) nssv_STRINGIFY_( x ) -#define nssv_STRINGIFY_( x ) #x - -// string-view lite configuration: - -#define nssv_STRING_VIEW_DEFAULT 0 -#define nssv_STRING_VIEW_NONSTD 1 -#define nssv_STRING_VIEW_STD 2 - -// tweak header support: - -#ifdef __has_include -# if __has_include() -# include -# endif -#define nssv_HAVE_TWEAK_HEADER 1 -#else -#define nssv_HAVE_TWEAK_HEADER 0 -//# pragma message("string_view.hpp: Note: Tweak header not supported.") -#endif - -// string_view selection and configuration: - -#if !defined( nssv_CONFIG_SELECT_STRING_VIEW ) -# define nssv_CONFIG_SELECT_STRING_VIEW ( nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD ) -#endif - -#ifndef nssv_CONFIG_STD_SV_OPERATOR -# define nssv_CONFIG_STD_SV_OPERATOR 0 -#endif - -#ifndef nssv_CONFIG_USR_SV_OPERATOR -# define nssv_CONFIG_USR_SV_OPERATOR 1 -#endif - -#ifdef nssv_CONFIG_CONVERSION_STD_STRING -# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS nssv_CONFIG_CONVERSION_STD_STRING -# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS nssv_CONFIG_CONVERSION_STD_STRING -#endif - -#ifndef nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS -# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS 1 -#endif - -#ifndef nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS -# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 1 -#endif - -#ifndef nssv_CONFIG_NO_STREAM_INSERTION -# define nssv_CONFIG_NO_STREAM_INSERTION 0 -#endif - -// Control presence of exception handling (try and auto discover): - -#ifndef nssv_CONFIG_NO_EXCEPTIONS -# if defined(_MSC_VER) -# include // for _HAS_EXCEPTIONS -# endif -# if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || (_HAS_EXCEPTIONS) -# define nssv_CONFIG_NO_EXCEPTIONS 0 -# else -# define nssv_CONFIG_NO_EXCEPTIONS 1 -# endif -#endif - -// C++ language version detection (C++23 is speculative): -// Note: VC14.0/1900 (VS2015) lacks too much from C++14. - -#ifndef nssv_CPLUSPLUS -# if defined(_MSVC_LANG ) && !defined(__clang__) -# define nssv_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG ) -# else -# define nssv_CPLUSPLUS __cplusplus -# endif -#endif - -#define nssv_CPP98_OR_GREATER ( nssv_CPLUSPLUS >= 199711L ) -#define nssv_CPP11_OR_GREATER ( nssv_CPLUSPLUS >= 201103L ) -#define nssv_CPP11_OR_GREATER_ ( nssv_CPLUSPLUS >= 201103L ) -#define nssv_CPP14_OR_GREATER ( nssv_CPLUSPLUS >= 201402L ) -#define nssv_CPP17_OR_GREATER ( nssv_CPLUSPLUS >= 201703L ) -#define nssv_CPP20_OR_GREATER ( nssv_CPLUSPLUS >= 202002L ) -#define nssv_CPP23_OR_GREATER ( nssv_CPLUSPLUS >= 202300L ) - -// use C++17 std::string_view if available and requested: - -#if nssv_CPP17_OR_GREATER && defined(__has_include ) -# if __has_include( ) -# define nssv_HAVE_STD_STRING_VIEW 1 -# else -# define nssv_HAVE_STD_STRING_VIEW 0 -# endif -#else -# define nssv_HAVE_STD_STRING_VIEW 0 -#endif - -#define nssv_USES_STD_STRING_VIEW ( (nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_STD) || ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_DEFAULT) && nssv_HAVE_STD_STRING_VIEW) ) - -#define nssv_HAVE_STARTS_WITH ( nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW ) -#define nssv_HAVE_ENDS_WITH nssv_HAVE_STARTS_WITH - -// -// Use C++17 std::string_view: -// - -#if nssv_USES_STD_STRING_VIEW - -#include - -// Extensions for std::string: - -#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS - -namespace nonstd { - -template< class CharT, class Traits, class Allocator = std::allocator > -std::basic_string -to_string( std::basic_string_view v, Allocator const & a = Allocator() ) -{ - return std::basic_string( v.begin(), v.end(), a ); -} - -template< class CharT, class Traits, class Allocator > -std::basic_string_view -to_string_view( std::basic_string const & s ) -{ - return std::basic_string_view( s.data(), s.size() ); -} - -// Literal operators sv and _sv: - -#if nssv_CONFIG_STD_SV_OPERATOR - -using namespace std::literals::string_view_literals; - -#endif - -#if nssv_CONFIG_USR_SV_OPERATOR - -inline namespace literals { -inline namespace string_view_literals { - - -constexpr std::string_view operator "" _sv( const char* str, size_t len ) noexcept // (1) -{ - return std::string_view{ str, len }; -} - -constexpr std::u16string_view operator "" _sv( const char16_t* str, size_t len ) noexcept // (2) -{ - return std::u16string_view{ str, len }; -} - -constexpr std::u32string_view operator "" _sv( const char32_t* str, size_t len ) noexcept // (3) -{ - return std::u32string_view{ str, len }; -} - -constexpr std::wstring_view operator "" _sv( const wchar_t* str, size_t len ) noexcept // (4) -{ - return std::wstring_view{ str, len }; -} - -}} // namespace literals::string_view_literals - -#endif // nssv_CONFIG_USR_SV_OPERATOR - -} // namespace nonstd - -#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS - -namespace nonstd { - -using std::string_view; -using std::wstring_view; -using std::u16string_view; -using std::u32string_view; -using std::basic_string_view; - -// literal "sv" and "_sv", see above - -using std::operator==; -using std::operator!=; -using std::operator<; -using std::operator<=; -using std::operator>; -using std::operator>=; - -using std::operator<<; - -} // namespace nonstd - -#else // nssv_HAVE_STD_STRING_VIEW - -// -// Before C++17: use string_view lite: -// - -// Compiler versions: -// -// MSVC++ 6.0 _MSC_VER == 1200 nssv_COMPILER_MSVC_VERSION == 60 (Visual Studio 6.0) -// MSVC++ 7.0 _MSC_VER == 1300 nssv_COMPILER_MSVC_VERSION == 70 (Visual Studio .NET 2002) -// MSVC++ 7.1 _MSC_VER == 1310 nssv_COMPILER_MSVC_VERSION == 71 (Visual Studio .NET 2003) -// MSVC++ 8.0 _MSC_VER == 1400 nssv_COMPILER_MSVC_VERSION == 80 (Visual Studio 2005) -// MSVC++ 9.0 _MSC_VER == 1500 nssv_COMPILER_MSVC_VERSION == 90 (Visual Studio 2008) -// MSVC++ 10.0 _MSC_VER == 1600 nssv_COMPILER_MSVC_VERSION == 100 (Visual Studio 2010) -// MSVC++ 11.0 _MSC_VER == 1700 nssv_COMPILER_MSVC_VERSION == 110 (Visual Studio 2012) -// MSVC++ 12.0 _MSC_VER == 1800 nssv_COMPILER_MSVC_VERSION == 120 (Visual Studio 2013) -// MSVC++ 14.0 _MSC_VER == 1900 nssv_COMPILER_MSVC_VERSION == 140 (Visual Studio 2015) -// MSVC++ 14.1 _MSC_VER >= 1910 nssv_COMPILER_MSVC_VERSION == 141 (Visual Studio 2017) -// MSVC++ 14.2 _MSC_VER >= 1920 nssv_COMPILER_MSVC_VERSION == 142 (Visual Studio 2019) - -#if defined(_MSC_VER ) && !defined(__clang__) -# define nssv_COMPILER_MSVC_VER (_MSC_VER ) -# define nssv_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) ) -#else -# define nssv_COMPILER_MSVC_VER 0 -# define nssv_COMPILER_MSVC_VERSION 0 -#endif - -#define nssv_COMPILER_VERSION( major, minor, patch ) ( 10 * ( 10 * (major) + (minor) ) + (patch) ) - -#if defined( __apple_build_version__ ) -# define nssv_COMPILER_APPLECLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__) -# define nssv_COMPILER_CLANG_VERSION 0 -#elif defined( __clang__ ) -# define nssv_COMPILER_APPLECLANG_VERSION 0 -# define nssv_COMPILER_CLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__) -#else -# define nssv_COMPILER_APPLECLANG_VERSION 0 -# define nssv_COMPILER_CLANG_VERSION 0 -#endif - -#if defined(__GNUC__) && !defined(__clang__) -# define nssv_COMPILER_GNUC_VERSION nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) -#else -# define nssv_COMPILER_GNUC_VERSION 0 -#endif - -// half-open range [lo..hi): -#define nssv_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) ) - -// Presence of language and library features: - -#ifdef _HAS_CPP0X -# define nssv_HAS_CPP0X _HAS_CPP0X -#else -# define nssv_HAS_CPP0X 0 -#endif - -// Unless defined otherwise below, consider VC14 as C++11 for variant-lite: - -#if nssv_COMPILER_MSVC_VER >= 1900 -# undef nssv_CPP11_OR_GREATER -# define nssv_CPP11_OR_GREATER 1 -#endif - -#define nssv_CPP11_90 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1500) -#define nssv_CPP11_100 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1600) -#define nssv_CPP11_110 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1700) -#define nssv_CPP11_120 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1800) -#define nssv_CPP11_140 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1900) -#define nssv_CPP11_141 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1910) - -#define nssv_CPP14_000 (nssv_CPP14_OR_GREATER) -#define nssv_CPP17_000 (nssv_CPP17_OR_GREATER) - -// Presence of C++11 language features: - -#define nssv_HAVE_CONSTEXPR_11 nssv_CPP11_140 -#define nssv_HAVE_EXPLICIT_CONVERSION nssv_CPP11_140 -#define nssv_HAVE_INLINE_NAMESPACE nssv_CPP11_140 -#define nssv_HAVE_IS_DEFAULT nssv_CPP11_140 -#define nssv_HAVE_IS_DELETE nssv_CPP11_140 -#define nssv_HAVE_NOEXCEPT nssv_CPP11_140 -#define nssv_HAVE_NULLPTR nssv_CPP11_100 -#define nssv_HAVE_REF_QUALIFIER nssv_CPP11_140 -#define nssv_HAVE_UNICODE_LITERALS nssv_CPP11_140 -#define nssv_HAVE_USER_DEFINED_LITERALS nssv_CPP11_140 -#define nssv_HAVE_WCHAR16_T nssv_CPP11_100 -#define nssv_HAVE_WCHAR32_T nssv_CPP11_100 - -#if ! ( ( nssv_CPP11_OR_GREATER && nssv_COMPILER_CLANG_VERSION ) || nssv_BETWEEN( nssv_COMPILER_CLANG_VERSION, 300, 400 ) ) -# define nssv_HAVE_STD_DEFINED_LITERALS nssv_CPP11_140 -#else -# define nssv_HAVE_STD_DEFINED_LITERALS 0 -#endif - -// Presence of C++14 language features: - -#define nssv_HAVE_CONSTEXPR_14 nssv_CPP14_000 - -// Presence of C++17 language features: - -#define nssv_HAVE_NODISCARD nssv_CPP17_000 - -// Presence of C++ library features: - -#define nssv_HAVE_STD_HASH nssv_CPP11_120 - -// Presence of compiler intrinsics: - -// Providing char-type specializations for compare() and length() that -// use compiler intrinsics can improve compile- and run-time performance. -// -// The challenge is in using the right combinations of builtin availability -// and its constexpr-ness. -// -// | compiler | __builtin_memcmp (constexpr) | memcmp (constexpr) | -// |----------|------------------------------|---------------------| -// | clang | 4.0 (>= 4.0 ) | any (? ) | -// | clang-a | 9.0 (>= 9.0 ) | any (? ) | -// | gcc | any (constexpr) | any (? ) | -// | msvc | >= 14.2 C++17 (>= 14.2 ) | any (? ) | - -#define nssv_HAVE_BUILTIN_VER ( (nssv_CPP17_000 && nssv_COMPILER_MSVC_VERSION >= 142) || nssv_COMPILER_GNUC_VERSION > 0 || nssv_COMPILER_CLANG_VERSION >= 400 || nssv_COMPILER_APPLECLANG_VERSION >= 900 ) -#define nssv_HAVE_BUILTIN_CE ( nssv_HAVE_BUILTIN_VER ) - -#define nssv_HAVE_BUILTIN_MEMCMP ( (nssv_HAVE_CONSTEXPR_14 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_14 ) -#define nssv_HAVE_BUILTIN_STRLEN ( (nssv_HAVE_CONSTEXPR_11 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_11 ) - -#ifdef __has_builtin -# define nssv_HAVE_BUILTIN( x ) __has_builtin( x ) -#else -# define nssv_HAVE_BUILTIN( x ) 0 -#endif - -#if nssv_HAVE_BUILTIN(__builtin_memcmp) || nssv_HAVE_BUILTIN_VER -# define nssv_BUILTIN_MEMCMP __builtin_memcmp -#else -# define nssv_BUILTIN_MEMCMP memcmp -#endif - -#if nssv_HAVE_BUILTIN(__builtin_strlen) || nssv_HAVE_BUILTIN_VER -# define nssv_BUILTIN_STRLEN __builtin_strlen -#else -# define nssv_BUILTIN_STRLEN strlen -#endif - -// C++ feature usage: - -#if nssv_HAVE_CONSTEXPR_11 -# define nssv_constexpr constexpr -#else -# define nssv_constexpr /*constexpr*/ -#endif - -#if nssv_HAVE_CONSTEXPR_14 -# define nssv_constexpr14 constexpr -#else -# define nssv_constexpr14 /*constexpr*/ -#endif - -#if nssv_HAVE_EXPLICIT_CONVERSION -# define nssv_explicit explicit -#else -# define nssv_explicit /*explicit*/ -#endif - -#if nssv_HAVE_INLINE_NAMESPACE -# define nssv_inline_ns inline -#else -# define nssv_inline_ns /*inline*/ -#endif - -#if nssv_HAVE_NOEXCEPT -# define nssv_noexcept noexcept -#else -# define nssv_noexcept /*noexcept*/ -#endif - -//#if nssv_HAVE_REF_QUALIFIER -//# define nssv_ref_qual & -//# define nssv_refref_qual && -//#else -//# define nssv_ref_qual /*&*/ -//# define nssv_refref_qual /*&&*/ -//#endif - -#if nssv_HAVE_NULLPTR -# define nssv_nullptr nullptr -#else -# define nssv_nullptr NULL -#endif - -#if nssv_HAVE_NODISCARD -# define nssv_nodiscard [[nodiscard]] -#else -# define nssv_nodiscard /*[[nodiscard]]*/ -#endif - -// Additional includes: - -#include -#include -#include -#include -#include // std::char_traits<> - -#if ! nssv_CONFIG_NO_STREAM_INSERTION -# include -#endif - -#if ! nssv_CONFIG_NO_EXCEPTIONS -# include -#endif - -#if nssv_CPP11_OR_GREATER -# include -#endif - -// Clang, GNUC, MSVC warning suppression macros: - -#if defined(__clang__) -# pragma clang diagnostic ignored "-Wreserved-user-defined-literal" -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wuser-defined-literals" -#elif defined(__GNUC__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wliteral-suffix" -#endif // __clang__ - -#if nssv_COMPILER_MSVC_VERSION >= 140 -# define nssv_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]] -# define nssv_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress: code) ) -# define nssv_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable: codes)) -#else -# define nssv_SUPPRESS_MSGSL_WARNING(expr) -# define nssv_SUPPRESS_MSVC_WARNING(code, descr) -# define nssv_DISABLE_MSVC_WARNINGS(codes) -#endif - -#if defined(__clang__) -# define nssv_RESTORE_WARNINGS() _Pragma("clang diagnostic pop") -#elif defined(__GNUC__) -# define nssv_RESTORE_WARNINGS() _Pragma("GCC diagnostic pop") -#elif nssv_COMPILER_MSVC_VERSION >= 140 -# define nssv_RESTORE_WARNINGS() __pragma(warning(pop )) -#else -# define nssv_RESTORE_WARNINGS() -#endif - -// Suppress the following MSVC (GSL) warnings: -// - C4455, non-gsl : 'operator ""sv': literal suffix identifiers that do not -// start with an underscore are reserved -// - C26472, gsl::t.1 : don't use a static_cast for arithmetic conversions; -// use brace initialization, gsl::narrow_cast or gsl::narow -// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead - -nssv_DISABLE_MSVC_WARNINGS( 4455 26481 26472 ) -//nssv_DISABLE_CLANG_WARNINGS( "-Wuser-defined-literals" ) -//nssv_DISABLE_GNUC_WARNINGS( -Wliteral-suffix ) - -namespace nonstd { namespace sv_lite { - -// -// basic_string_view declaration: -// - -template -< - class CharT, - class Traits = std::char_traits -> -class basic_string_view; - -namespace detail { - -// support constexpr comparison in C++14; -// for C++17 and later, use provided traits: - -template< typename CharT > -inline nssv_constexpr14 int compare( CharT const * s1, CharT const * s2, std::size_t count ) -{ - while ( count-- != 0 ) - { - if ( *s1 < *s2 ) return -1; - if ( *s1 > *s2 ) return +1; - ++s1; ++s2; - } - return 0; -} - -#if nssv_HAVE_BUILTIN_MEMCMP - -// specialization of compare() for char, see also generic compare() above: - -inline nssv_constexpr14 int compare( char const * s1, char const * s2, std::size_t count ) -{ - return nssv_BUILTIN_MEMCMP( s1, s2, count ); -} - -#endif - -#if nssv_HAVE_BUILTIN_STRLEN - -// specialization of length() for char, see also generic length() further below: - -inline nssv_constexpr std::size_t length( char const * s ) -{ - return nssv_BUILTIN_STRLEN( s ); -} - -#endif - -#if defined(__OPTIMIZE__) - -// gcc, clang provide __OPTIMIZE__ -// Expect tail call optimization to make length() non-recursive: - -template< typename CharT > -inline nssv_constexpr std::size_t length( CharT * s, std::size_t result = 0 ) -{ - return *s == '\0' ? result : length( s + 1, result + 1 ); -} - -#else // OPTIMIZE - -// non-recursive: - -template< typename CharT > -inline nssv_constexpr14 std::size_t length( CharT * s ) -{ - std::size_t result = 0; - while ( *s++ != '\0' ) - { - ++result; - } - return result; -} - -#endif // OPTIMIZE - -#if nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER -#if defined(__OPTIMIZE__) - -// gcc, clang provide __OPTIMIZE__ -// Expect tail call optimization to make search() non-recursive: - -template< class CharT, class Traits = std::char_traits > -constexpr const CharT* search( basic_string_view haystack, basic_string_view needle ) -{ - return haystack.starts_with( needle ) ? haystack.begin() : - haystack.empty() ? haystack.end() : search( haystack.substr(1), needle ); -} - -#else // OPTIMIZE - -// non-recursive: - -template< class CharT, class Traits = std::char_traits > -constexpr const CharT* search( basic_string_view haystack, basic_string_view needle ) -{ - return std::search( haystack.begin(), haystack.end(), needle.begin(), needle.end() ); -} - -#endif // OPTIMIZE -#endif // nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER - -} // namespace detail - -// -// basic_string_view: -// - -template -< - class CharT, - class Traits /* = std::char_traits */ -> -class basic_string_view -{ -public: - // Member types: - - typedef Traits traits_type; - typedef CharT value_type; - - typedef CharT * pointer; - typedef CharT const * const_pointer; - typedef CharT & reference; - typedef CharT const & const_reference; - - typedef const_pointer iterator; - typedef const_pointer const_iterator; - typedef std::reverse_iterator< const_iterator > reverse_iterator; - typedef std::reverse_iterator< const_iterator > const_reverse_iterator; - - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - - // 24.4.2.1 Construction and assignment: - - nssv_constexpr basic_string_view() nssv_noexcept - : data_( nssv_nullptr ) - , size_( 0 ) - {} - -#if nssv_CPP11_OR_GREATER - nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept = default; -#else - nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept - : data_( other.data_) - , size_( other.size_) - {} -#endif - - nssv_constexpr basic_string_view( CharT const * s, size_type count ) nssv_noexcept // non-standard noexcept - : data_( s ) - , size_( count ) - {} - - nssv_constexpr basic_string_view( CharT const * s) nssv_noexcept // non-standard noexcept - : data_( s ) -#if nssv_CPP17_OR_GREATER - , size_( Traits::length(s) ) -#elif nssv_CPP11_OR_GREATER - , size_( detail::length(s) ) -#else - , size_( Traits::length(s) ) -#endif - {} - -#if nssv_HAVE_NULLPTR -# if nssv_HAVE_IS_DELETE - nssv_constexpr basic_string_view( std::nullptr_t ) nssv_noexcept = delete; -# else - private: nssv_constexpr basic_string_view( std::nullptr_t ) nssv_noexcept; public: -# endif -#endif - - // Assignment: - -#if nssv_CPP11_OR_GREATER - nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept = default; -#else - nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept - { - data_ = other.data_; - size_ = other.size_; - return *this; - } -#endif - - // 24.4.2.2 Iterator support: - - nssv_constexpr const_iterator begin() const nssv_noexcept { return data_; } - nssv_constexpr const_iterator end() const nssv_noexcept { return data_ + size_; } - - nssv_constexpr const_iterator cbegin() const nssv_noexcept { return begin(); } - nssv_constexpr const_iterator cend() const nssv_noexcept { return end(); } - - nssv_constexpr const_reverse_iterator rbegin() const nssv_noexcept { return const_reverse_iterator( end() ); } - nssv_constexpr const_reverse_iterator rend() const nssv_noexcept { return const_reverse_iterator( begin() ); } - - nssv_constexpr const_reverse_iterator crbegin() const nssv_noexcept { return rbegin(); } - nssv_constexpr const_reverse_iterator crend() const nssv_noexcept { return rend(); } - - // 24.4.2.3 Capacity: - - nssv_constexpr size_type size() const nssv_noexcept { return size_; } - nssv_constexpr size_type length() const nssv_noexcept { return size_; } - nssv_constexpr size_type max_size() const nssv_noexcept { return (std::numeric_limits< size_type >::max)(); } - - // since C++20 - nssv_nodiscard nssv_constexpr bool empty() const nssv_noexcept - { - return 0 == size_; - } - - // 24.4.2.4 Element access: - - nssv_constexpr const_reference operator[]( size_type pos ) const - { - return data_at( pos ); - } - - nssv_constexpr14 const_reference at( size_type pos ) const - { -#if nssv_CONFIG_NO_EXCEPTIONS - assert( pos < size() ); -#else - if ( pos >= size() ) - { - throw std::out_of_range("nonstd::string_view::at()"); - } -#endif - return data_at( pos ); - } - - nssv_constexpr const_reference front() const { return data_at( 0 ); } - nssv_constexpr const_reference back() const { return data_at( size() - 1 ); } - - nssv_constexpr const_pointer data() const nssv_noexcept { return data_; } - - // 24.4.2.5 Modifiers: - - nssv_constexpr14 void remove_prefix( size_type n ) - { - assert( n <= size() ); - data_ += n; - size_ -= n; - } - - nssv_constexpr14 void remove_suffix( size_type n ) - { - assert( n <= size() ); - size_ -= n; - } - - nssv_constexpr14 void swap( basic_string_view & other ) nssv_noexcept - { - const basic_string_view tmp(other); - other = *this; - *this = tmp; - } - - // 24.4.2.6 String operations: - - size_type copy( CharT * dest, size_type n, size_type pos = 0 ) const - { -#if nssv_CONFIG_NO_EXCEPTIONS - assert( pos <= size() ); -#else - if ( pos > size() ) - { - throw std::out_of_range("nonstd::string_view::copy()"); - } -#endif - const size_type rlen = (std::min)( n, size() - pos ); - - (void) Traits::copy( dest, data() + pos, rlen ); - - return rlen; - } - - nssv_constexpr14 basic_string_view substr( size_type pos = 0, size_type n = npos ) const - { -#if nssv_CONFIG_NO_EXCEPTIONS - assert( pos <= size() ); -#else - if ( pos > size() ) - { - throw std::out_of_range("nonstd::string_view::substr()"); - } -#endif - return basic_string_view( data() + pos, (std::min)( n, size() - pos ) ); - } - - // compare(), 6x: - - nssv_constexpr14 int compare( basic_string_view other ) const nssv_noexcept // (1) - { -#if nssv_CPP17_OR_GREATER - if ( const int result = Traits::compare( data(), other.data(), (std::min)( size(), other.size() ) ) ) -#else - if ( const int result = detail::compare( data(), other.data(), (std::min)( size(), other.size() ) ) ) -#endif - { - return result; - } - - return size() == other.size() ? 0 : size() < other.size() ? -1 : 1; - } - - nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other ) const // (2) - { - return substr( pos1, n1 ).compare( other ); - } - - nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other, size_type pos2, size_type n2 ) const // (3) - { - return substr( pos1, n1 ).compare( other.substr( pos2, n2 ) ); - } - - nssv_constexpr int compare( CharT const * s ) const // (4) - { - return compare( basic_string_view( s ) ); - } - - nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s ) const // (5) - { - return substr( pos1, n1 ).compare( basic_string_view( s ) ); - } - - nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s, size_type n2 ) const // (6) - { - return substr( pos1, n1 ).compare( basic_string_view( s, n2 ) ); - } - - // 24.4.2.7 Searching: - - // starts_with(), 3x, since C++20: - - nssv_constexpr bool starts_with( basic_string_view v ) const nssv_noexcept // (1) - { - return size() >= v.size() && compare( 0, v.size(), v ) == 0; - } - - nssv_constexpr bool starts_with( CharT c ) const nssv_noexcept // (2) - { - return starts_with( basic_string_view( &c, 1 ) ); - } - - nssv_constexpr bool starts_with( CharT const * s ) const // (3) - { - return starts_with( basic_string_view( s ) ); - } - - // ends_with(), 3x, since C++20: - - nssv_constexpr bool ends_with( basic_string_view v ) const nssv_noexcept // (1) - { - return size() >= v.size() && compare( size() - v.size(), npos, v ) == 0; - } - - nssv_constexpr bool ends_with( CharT c ) const nssv_noexcept // (2) - { - return ends_with( basic_string_view( &c, 1 ) ); - } - - nssv_constexpr bool ends_with( CharT const * s ) const // (3) - { - return ends_with( basic_string_view( s ) ); - } - - // find(), 4x: - - nssv_constexpr size_type find( basic_string_view v, size_type pos = 0 ) const nssv_noexcept // (1) - { - return assert( v.size() == 0 || v.data() != nssv_nullptr ) - , pos >= size() - ? npos : to_pos( -#if nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER - detail::search( substr(pos), v ) -#else - std::search( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) -#endif - ); - } - - nssv_constexpr size_type find( CharT c, size_type pos = 0 ) const nssv_noexcept // (2) - { - return find( basic_string_view( &c, 1 ), pos ); - } - - nssv_constexpr size_type find( CharT const * s, size_type pos, size_type n ) const // (3) - { - return find( basic_string_view( s, n ), pos ); - } - - nssv_constexpr size_type find( CharT const * s, size_type pos = 0 ) const // (4) - { - return find( basic_string_view( s ), pos ); - } - - // rfind(), 4x: - - nssv_constexpr14 size_type rfind( basic_string_view v, size_type pos = npos ) const nssv_noexcept // (1) - { - if ( size() < v.size() ) - { - return npos; - } - - if ( v.empty() ) - { - return (std::min)( size(), pos ); - } - - const_iterator last = cbegin() + (std::min)( size() - v.size(), pos ) + v.size(); - const_iterator result = std::find_end( cbegin(), last, v.cbegin(), v.cend(), Traits::eq ); - - return result != last ? size_type( result - cbegin() ) : npos; - } - - nssv_constexpr14 size_type rfind( CharT c, size_type pos = npos ) const nssv_noexcept // (2) - { - return rfind( basic_string_view( &c, 1 ), pos ); - } - - nssv_constexpr14 size_type rfind( CharT const * s, size_type pos, size_type n ) const // (3) - { - return rfind( basic_string_view( s, n ), pos ); - } - - nssv_constexpr14 size_type rfind( CharT const * s, size_type pos = npos ) const // (4) - { - return rfind( basic_string_view( s ), pos ); - } - - // find_first_of(), 4x: - - nssv_constexpr size_type find_first_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept // (1) - { - return pos >= size() - ? npos - : to_pos( std::find_first_of( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) ); - } - - nssv_constexpr size_type find_first_of( CharT c, size_type pos = 0 ) const nssv_noexcept // (2) - { - return find_first_of( basic_string_view( &c, 1 ), pos ); - } - - nssv_constexpr size_type find_first_of( CharT const * s, size_type pos, size_type n ) const // (3) - { - return find_first_of( basic_string_view( s, n ), pos ); - } - - nssv_constexpr size_type find_first_of( CharT const * s, size_type pos = 0 ) const // (4) - { - return find_first_of( basic_string_view( s ), pos ); - } - - // find_last_of(), 4x: - - nssv_constexpr size_type find_last_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept // (1) - { - return empty() - ? npos - : pos >= size() - ? find_last_of( v, size() - 1 ) - : to_pos( std::find_first_of( const_reverse_iterator( cbegin() + pos + 1 ), crend(), v.cbegin(), v.cend(), Traits::eq ) ); - } - - nssv_constexpr size_type find_last_of( CharT c, size_type pos = npos ) const nssv_noexcept // (2) - { - return find_last_of( basic_string_view( &c, 1 ), pos ); - } - - nssv_constexpr size_type find_last_of( CharT const * s, size_type pos, size_type count ) const // (3) - { - return find_last_of( basic_string_view( s, count ), pos ); - } - - nssv_constexpr size_type find_last_of( CharT const * s, size_type pos = npos ) const // (4) - { - return find_last_of( basic_string_view( s ), pos ); - } - - // find_first_not_of(), 4x: - - nssv_constexpr size_type find_first_not_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept // (1) - { - return pos >= size() - ? npos - : to_pos( std::find_if( cbegin() + pos, cend(), not_in_view( v ) ) ); - } - - nssv_constexpr size_type find_first_not_of( CharT c, size_type pos = 0 ) const nssv_noexcept // (2) - { - return find_first_not_of( basic_string_view( &c, 1 ), pos ); - } - - nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos, size_type count ) const // (3) - { - return find_first_not_of( basic_string_view( s, count ), pos ); - } - - nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos = 0 ) const // (4) - { - return find_first_not_of( basic_string_view( s ), pos ); - } - - // find_last_not_of(), 4x: - - nssv_constexpr size_type find_last_not_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept // (1) - { - return empty() - ? npos - : pos >= size() - ? find_last_not_of( v, size() - 1 ) - : to_pos( std::find_if( const_reverse_iterator( cbegin() + pos + 1 ), crend(), not_in_view( v ) ) ); - } - - nssv_constexpr size_type find_last_not_of( CharT c, size_type pos = npos ) const nssv_noexcept // (2) - { - return find_last_not_of( basic_string_view( &c, 1 ), pos ); - } - - nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos, size_type count ) const // (3) - { - return find_last_not_of( basic_string_view( s, count ), pos ); - } - - nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos = npos ) const // (4) - { - return find_last_not_of( basic_string_view( s ), pos ); - } - - // Constants: - -#if nssv_CPP17_OR_GREATER - static nssv_constexpr size_type npos = size_type(-1); -#elif nssv_CPP11_OR_GREATER - enum : size_type { npos = size_type(-1) }; -#else - enum { npos = size_type(-1) }; -#endif - -private: - struct not_in_view - { - const basic_string_view v; - - nssv_constexpr explicit not_in_view( basic_string_view v_ ) : v( v_ ) {} - - nssv_constexpr bool operator()( CharT c ) const - { - return npos == v.find_first_of( c ); - } - }; - - nssv_constexpr size_type to_pos( const_iterator it ) const - { - return it == cend() ? npos : size_type( it - cbegin() ); - } - - nssv_constexpr size_type to_pos( const_reverse_iterator it ) const - { - return it == crend() ? npos : size_type( crend() - it - 1 ); - } - - nssv_constexpr const_reference data_at( size_type pos ) const - { -#if nssv_BETWEEN( nssv_COMPILER_GNUC_VERSION, 1, 500 ) - return data_[pos]; -#else - return assert( pos < size() ), data_[pos]; -#endif - } - -private: - const_pointer data_; - size_type size_; - -public: -#if nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS - - template< class Allocator > - basic_string_view( std::basic_string const & s ) nssv_noexcept - : data_( s.data() ) - , size_( s.size() ) - {} - -#if nssv_HAVE_EXPLICIT_CONVERSION - - template< class Allocator > - explicit operator std::basic_string() const - { - return to_string( Allocator() ); - } - -#endif // nssv_HAVE_EXPLICIT_CONVERSION - -#if nssv_CPP11_OR_GREATER - - template< class Allocator = std::allocator > - std::basic_string - to_string( Allocator const & a = Allocator() ) const - { - return std::basic_string( begin(), end(), a ); - } - -#else - - std::basic_string - to_string() const - { - return std::basic_string( begin(), end() ); - } - - template< class Allocator > - std::basic_string - to_string( Allocator const & a ) const - { - return std::basic_string( begin(), end(), a ); - } - -#endif // nssv_CPP11_OR_GREATER - -#endif // nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS -}; - -// -// Non-member functions: -// - -// 24.4.3 Non-member comparison functions: -// lexicographically compare two string views (function template): - -template< class CharT, class Traits > -nssv_constexpr bool operator== ( - basic_string_view lhs, - basic_string_view rhs ) nssv_noexcept -{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; } - -template< class CharT, class Traits > -nssv_constexpr bool operator!= ( - basic_string_view lhs, - basic_string_view rhs ) nssv_noexcept -{ return !( lhs == rhs ); } - -template< class CharT, class Traits > -nssv_constexpr bool operator< ( - basic_string_view lhs, - basic_string_view rhs ) nssv_noexcept -{ return lhs.compare( rhs ) < 0; } - -template< class CharT, class Traits > -nssv_constexpr bool operator<= ( - basic_string_view lhs, - basic_string_view rhs ) nssv_noexcept -{ return lhs.compare( rhs ) <= 0; } - -template< class CharT, class Traits > -nssv_constexpr bool operator> ( - basic_string_view lhs, - basic_string_view rhs ) nssv_noexcept -{ return lhs.compare( rhs ) > 0; } - -template< class CharT, class Traits > -nssv_constexpr bool operator>= ( - basic_string_view lhs, - basic_string_view rhs ) nssv_noexcept -{ return lhs.compare( rhs ) >= 0; } - -// Let S be basic_string_view, and sv be an instance of S. -// Implementations shall provide sufficient additional overloads marked -// constexpr and noexcept so that an object t with an implicit conversion -// to S can be compared according to Table 67. - -#if ! nssv_CPP11_OR_GREATER || nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 ) - -// accommodate for older compilers: - -// == - -template< class CharT, class Traits> -nssv_constexpr bool operator==( - basic_string_view lhs, - CharT const * rhs ) nssv_noexcept -{ return lhs.size() == detail::length( rhs ) && lhs.compare( rhs ) == 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator==( - CharT const * lhs, - basic_string_view rhs ) nssv_noexcept -{ return detail::length( lhs ) == rhs.size() && rhs.compare( lhs ) == 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator==( - basic_string_view lhs, - std::basic_string rhs ) nssv_noexcept -{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator==( - std::basic_string rhs, - basic_string_view lhs ) nssv_noexcept -{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; } - -// != - -template< class CharT, class Traits> -nssv_constexpr bool operator!=( - basic_string_view lhs, - CharT const * rhs ) nssv_noexcept -{ return !( lhs == rhs ); } - -template< class CharT, class Traits> -nssv_constexpr bool operator!=( - CharT const * lhs, - basic_string_view rhs ) nssv_noexcept -{ return !( lhs == rhs ); } - -template< class CharT, class Traits> -nssv_constexpr bool operator!=( - basic_string_view lhs, - std::basic_string rhs ) nssv_noexcept -{ return !( lhs == rhs ); } - -template< class CharT, class Traits> -nssv_constexpr bool operator!=( - std::basic_string rhs, - basic_string_view lhs ) nssv_noexcept -{ return !( lhs == rhs ); } - -// < - -template< class CharT, class Traits> -nssv_constexpr bool operator<( - basic_string_view lhs, - CharT const * rhs ) nssv_noexcept -{ return lhs.compare( rhs ) < 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator<( - CharT const * lhs, - basic_string_view rhs ) nssv_noexcept -{ return rhs.compare( lhs ) > 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator<( - basic_string_view lhs, - std::basic_string rhs ) nssv_noexcept -{ return lhs.compare( rhs ) < 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator<( - std::basic_string rhs, - basic_string_view lhs ) nssv_noexcept -{ return rhs.compare( lhs ) > 0; } - -// <= - -template< class CharT, class Traits> -nssv_constexpr bool operator<=( - basic_string_view lhs, - CharT const * rhs ) nssv_noexcept -{ return lhs.compare( rhs ) <= 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator<=( - CharT const * lhs, - basic_string_view rhs ) nssv_noexcept -{ return rhs.compare( lhs ) >= 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator<=( - basic_string_view lhs, - std::basic_string rhs ) nssv_noexcept -{ return lhs.compare( rhs ) <= 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator<=( - std::basic_string rhs, - basic_string_view lhs ) nssv_noexcept -{ return rhs.compare( lhs ) >= 0; } - -// > - -template< class CharT, class Traits> -nssv_constexpr bool operator>( - basic_string_view lhs, - CharT const * rhs ) nssv_noexcept -{ return lhs.compare( rhs ) > 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator>( - CharT const * lhs, - basic_string_view rhs ) nssv_noexcept -{ return rhs.compare( lhs ) < 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator>( - basic_string_view lhs, - std::basic_string rhs ) nssv_noexcept -{ return lhs.compare( rhs ) > 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator>( - std::basic_string rhs, - basic_string_view lhs ) nssv_noexcept -{ return rhs.compare( lhs ) < 0; } - -// >= - -template< class CharT, class Traits> -nssv_constexpr bool operator>=( - basic_string_view lhs, - CharT const * rhs ) nssv_noexcept -{ return lhs.compare( rhs ) >= 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator>=( - CharT const * lhs, - basic_string_view rhs ) nssv_noexcept -{ return rhs.compare( lhs ) <= 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator>=( - basic_string_view lhs, - std::basic_string rhs ) nssv_noexcept -{ return lhs.compare( rhs ) >= 0; } - -template< class CharT, class Traits> -nssv_constexpr bool operator>=( - std::basic_string rhs, - basic_string_view lhs ) nssv_noexcept -{ return rhs.compare( lhs ) <= 0; } - -#else // newer compilers: - -#define nssv_BASIC_STRING_VIEW_I(T,U) typename std::decay< basic_string_view >::type - -#if defined(_MSC_VER) // issue 40 -# define nssv_MSVC_ORDER(x) , int=x -#else -# define nssv_MSVC_ORDER(x) /*, int=x*/ -#endif - -// == - -template< class CharT, class Traits nssv_MSVC_ORDER(1) > -nssv_constexpr bool operator==( - basic_string_view lhs, - nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs ) nssv_noexcept -{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; } - -template< class CharT, class Traits nssv_MSVC_ORDER(2) > -nssv_constexpr bool operator==( - nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs, - basic_string_view rhs ) nssv_noexcept -{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; } - -// != - -template< class CharT, class Traits nssv_MSVC_ORDER(1) > -nssv_constexpr bool operator!= ( - basic_string_view < CharT, Traits > lhs, - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept -{ return !( lhs == rhs ); } - -template< class CharT, class Traits nssv_MSVC_ORDER(2) > -nssv_constexpr bool operator!= ( - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs, - basic_string_view < CharT, Traits > rhs ) nssv_noexcept -{ return !( lhs == rhs ); } - -// < - -template< class CharT, class Traits nssv_MSVC_ORDER(1) > -nssv_constexpr bool operator< ( - basic_string_view < CharT, Traits > lhs, - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept -{ return lhs.compare( rhs ) < 0; } - -template< class CharT, class Traits nssv_MSVC_ORDER(2) > -nssv_constexpr bool operator< ( - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs, - basic_string_view < CharT, Traits > rhs ) nssv_noexcept -{ return lhs.compare( rhs ) < 0; } - -// <= - -template< class CharT, class Traits nssv_MSVC_ORDER(1) > -nssv_constexpr bool operator<= ( - basic_string_view < CharT, Traits > lhs, - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept -{ return lhs.compare( rhs ) <= 0; } - -template< class CharT, class Traits nssv_MSVC_ORDER(2) > -nssv_constexpr bool operator<= ( - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs, - basic_string_view < CharT, Traits > rhs ) nssv_noexcept -{ return lhs.compare( rhs ) <= 0; } - -// > - -template< class CharT, class Traits nssv_MSVC_ORDER(1) > -nssv_constexpr bool operator> ( - basic_string_view < CharT, Traits > lhs, - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept -{ return lhs.compare( rhs ) > 0; } - -template< class CharT, class Traits nssv_MSVC_ORDER(2) > -nssv_constexpr bool operator> ( - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs, - basic_string_view < CharT, Traits > rhs ) nssv_noexcept -{ return lhs.compare( rhs ) > 0; } - -// >= - -template< class CharT, class Traits nssv_MSVC_ORDER(1) > -nssv_constexpr bool operator>= ( - basic_string_view < CharT, Traits > lhs, - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept -{ return lhs.compare( rhs ) >= 0; } - -template< class CharT, class Traits nssv_MSVC_ORDER(2) > -nssv_constexpr bool operator>= ( - nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs, - basic_string_view < CharT, Traits > rhs ) nssv_noexcept -{ return lhs.compare( rhs ) >= 0; } - -#undef nssv_MSVC_ORDER -#undef nssv_BASIC_STRING_VIEW_I - -#endif // compiler-dependent approach to comparisons - -// 24.4.4 Inserters and extractors: - -#if ! nssv_CONFIG_NO_STREAM_INSERTION - -namespace detail { - -template< class Stream > -void write_padding( Stream & os, std::streamsize n ) -{ - for ( std::streamsize i = 0; i < n; ++i ) - os.rdbuf()->sputc( os.fill() ); -} - -template< class Stream, class View > -Stream & write_to_stream( Stream & os, View const & sv ) -{ - typename Stream::sentry sentry( os ); - - if ( !sentry ) - return os; - - const std::streamsize length = static_cast( sv.length() ); - - // Whether, and how, to pad: - const bool pad = ( length < os.width() ); - const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right; - - if ( left_pad ) - write_padding( os, os.width() - length ); - - // Write span characters: - os.rdbuf()->sputn( sv.begin(), length ); - - if ( pad && !left_pad ) - write_padding( os, os.width() - length ); - - // Reset output stream width: - os.width( 0 ); - - return os; -} - -} // namespace detail - -template< class CharT, class Traits > -std::basic_ostream & -operator<<( - std::basic_ostream& os, - basic_string_view sv ) -{ - return detail::write_to_stream( os, sv ); -} - -#endif // nssv_CONFIG_NO_STREAM_INSERTION - -// Several typedefs for common character types are provided: - -typedef basic_string_view string_view; -typedef basic_string_view wstring_view; -#if nssv_HAVE_WCHAR16_T -typedef basic_string_view u16string_view; -typedef basic_string_view u32string_view; -#endif - -}} // namespace nonstd::sv_lite - -// -// 24.4.6 Suffix for basic_string_view literals: -// - -#if nssv_HAVE_USER_DEFINED_LITERALS - -namespace nonstd { -nssv_inline_ns namespace literals { -nssv_inline_ns namespace string_view_literals { - -#if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS - -nssv_constexpr nonstd::sv_lite::string_view operator "" sv( const char* str, size_t len ) nssv_noexcept // (1) -{ - return nonstd::sv_lite::string_view{ str, len }; -} - -nssv_constexpr nonstd::sv_lite::u16string_view operator "" sv( const char16_t* str, size_t len ) nssv_noexcept // (2) -{ - return nonstd::sv_lite::u16string_view{ str, len }; -} - -nssv_constexpr nonstd::sv_lite::u32string_view operator "" sv( const char32_t* str, size_t len ) nssv_noexcept // (3) -{ - return nonstd::sv_lite::u32string_view{ str, len }; -} - -nssv_constexpr nonstd::sv_lite::wstring_view operator "" sv( const wchar_t* str, size_t len ) nssv_noexcept // (4) -{ - return nonstd::sv_lite::wstring_view{ str, len }; -} - -#endif // nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS - -#if nssv_CONFIG_USR_SV_OPERATOR - -nssv_constexpr nonstd::sv_lite::string_view operator "" _sv( const char* str, size_t len ) nssv_noexcept // (1) -{ - return nonstd::sv_lite::string_view{ str, len }; -} - -nssv_constexpr nonstd::sv_lite::u16string_view operator "" _sv( const char16_t* str, size_t len ) nssv_noexcept // (2) -{ - return nonstd::sv_lite::u16string_view{ str, len }; -} - -nssv_constexpr nonstd::sv_lite::u32string_view operator "" _sv( const char32_t* str, size_t len ) nssv_noexcept // (3) -{ - return nonstd::sv_lite::u32string_view{ str, len }; -} - -nssv_constexpr nonstd::sv_lite::wstring_view operator "" _sv( const wchar_t* str, size_t len ) nssv_noexcept // (4) -{ - return nonstd::sv_lite::wstring_view{ str, len }; -} - -#endif // nssv_CONFIG_USR_SV_OPERATOR - -}}} // namespace nonstd::literals::string_view_literals - -#endif - -// -// Extensions for std::string: -// - -#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS - -namespace nonstd { -namespace sv_lite { - -// Exclude MSVC 14 (19.00): it yields ambiguous to_string(): - -#if nssv_CPP11_OR_GREATER && nssv_COMPILER_MSVC_VERSION != 140 - -template< class CharT, class Traits, class Allocator = std::allocator > -std::basic_string -to_string( basic_string_view v, Allocator const & a = Allocator() ) -{ - return std::basic_string( v.begin(), v.end(), a ); -} - -#else - -template< class CharT, class Traits > -std::basic_string -to_string( basic_string_view v ) -{ - return std::basic_string( v.begin(), v.end() ); -} - -template< class CharT, class Traits, class Allocator > -std::basic_string -to_string( basic_string_view v, Allocator const & a ) -{ - return std::basic_string( v.begin(), v.end(), a ); -} - -#endif // nssv_CPP11_OR_GREATER - -template< class CharT, class Traits, class Allocator > -basic_string_view -to_string_view( std::basic_string const & s ) -{ - return basic_string_view( s.data(), s.size() ); -} - -}} // namespace nonstd::sv_lite - -#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS - -// -// make types and algorithms available in namespace nonstd: -// - -namespace nonstd { - -using sv_lite::basic_string_view; -using sv_lite::string_view; -using sv_lite::wstring_view; - -#if nssv_HAVE_WCHAR16_T -using sv_lite::u16string_view; -#endif -#if nssv_HAVE_WCHAR32_T -using sv_lite::u32string_view; -#endif - -// literal "sv" - -using sv_lite::operator==; -using sv_lite::operator!=; -using sv_lite::operator<; -using sv_lite::operator<=; -using sv_lite::operator>; -using sv_lite::operator>=; - -#if ! nssv_CONFIG_NO_STREAM_INSERTION -using sv_lite::operator<<; -#endif - -#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS -using sv_lite::to_string; -using sv_lite::to_string_view; -#endif - -} // namespace nonstd - -// 24.4.5 Hash support (C++11): - -// Note: The hash value of a string view object is equal to the hash value of -// the corresponding string object. - -#if nssv_HAVE_STD_HASH - -#include - -namespace std { - -template<> -struct hash< nonstd::string_view > -{ -public: - std::size_t operator()( nonstd::string_view v ) const nssv_noexcept - { - return std::hash()( std::string( v.data(), v.size() ) ); - } -}; - -template<> -struct hash< nonstd::wstring_view > -{ -public: - std::size_t operator()( nonstd::wstring_view v ) const nssv_noexcept - { - return std::hash()( std::wstring( v.data(), v.size() ) ); - } -}; - -template<> -struct hash< nonstd::u16string_view > -{ -public: - std::size_t operator()( nonstd::u16string_view v ) const nssv_noexcept - { - return std::hash()( std::u16string( v.data(), v.size() ) ); - } -}; - -template<> -struct hash< nonstd::u32string_view > -{ -public: - std::size_t operator()( nonstd::u32string_view v ) const nssv_noexcept - { - return std::hash()( std::u32string( v.data(), v.size() ) ); - } -}; - -} // namespace std - -#endif // nssv_HAVE_STD_HASH - -nssv_RESTORE_WARNINGS() - -#endif // nssv_HAVE_STD_STRING_VIEW -#endif // NONSTD_SV_LITE_H_INCLUDED diff --git a/gframe/sound_manager.cpp b/gframe/sound_manager.cpp index f44f4f18f..7e8dee924 100644 --- a/gframe/sound_manager.cpp +++ b/gframe/sound_manager.cpp @@ -76,30 +76,30 @@ void SoundManager::RefreshBGMList() { void SoundManager::RefreshSoundsList() { #ifdef BACKEND static constexpr std::pair fx[]{ - {SUMMON, EPRO_TEXT("./sound/summon.{}"_sv)}, - {SPECIAL_SUMMON, EPRO_TEXT("./sound/specialsummon.{}"_sv)}, - {ACTIVATE, EPRO_TEXT("./sound/activate.{}"_sv)}, - {SET, EPRO_TEXT("./sound/set.{}"_sv)}, - {FLIP, EPRO_TEXT("./sound/flip.{}"_sv)}, - {REVEAL, EPRO_TEXT("./sound/reveal.{}"_sv)}, - {EQUIP, EPRO_TEXT("./sound/equip.{}"_sv)}, - {DESTROYED, EPRO_TEXT("./sound/destroyed.{}"_sv)}, - {BANISHED, EPRO_TEXT("./sound/banished.{}"_sv)}, - {TOKEN, EPRO_TEXT("./sound/token.{}"_sv)}, - {ATTACK, EPRO_TEXT("./sound/attack.{}"_sv)}, - {DIRECT_ATTACK, EPRO_TEXT("./sound/directattack.{}"_sv)}, - {DRAW, EPRO_TEXT("./sound/draw.{}"_sv)}, - {SHUFFLE, EPRO_TEXT("./sound/shuffle.{}"_sv)}, - {DAMAGE, EPRO_TEXT("./sound/damage.{}"_sv)}, - {RECOVER, EPRO_TEXT("./sound/gainlp.{}"_sv)}, - {COUNTER_ADD, EPRO_TEXT("./sound/addcounter.{}"_sv)}, - {COUNTER_REMOVE, EPRO_TEXT("./sound/removecounter.{}"_sv)}, - {COIN, EPRO_TEXT("./sound/coinflip.{}"_sv)}, - {DICE, EPRO_TEXT("./sound/diceroll.{}"_sv)}, - {NEXT_TURN, EPRO_TEXT("./sound/nextturn.{}"_sv)}, - {PHASE, EPRO_TEXT("./sound/phase.{}"_sv)}, - {PLAYER_ENTER, EPRO_TEXT("./sound/playerenter.{}"_sv)}, - {CHAT, EPRO_TEXT("./sound/chatmessage.{}"_sv)} + {SUMMON, EPRO_TEXT("./sound/summon.{}"sv)}, + {SPECIAL_SUMMON, EPRO_TEXT("./sound/specialsummon.{}"sv)}, + {ACTIVATE, EPRO_TEXT("./sound/activate.{}"sv)}, + {SET, EPRO_TEXT("./sound/set.{}"sv)}, + {FLIP, EPRO_TEXT("./sound/flip.{}"sv)}, + {REVEAL, EPRO_TEXT("./sound/reveal.{}"sv)}, + {EQUIP, EPRO_TEXT("./sound/equip.{}"sv)}, + {DESTROYED, EPRO_TEXT("./sound/destroyed.{}"sv)}, + {BANISHED, EPRO_TEXT("./sound/banished.{}"sv)}, + {TOKEN, EPRO_TEXT("./sound/token.{}"sv)}, + {ATTACK, EPRO_TEXT("./sound/attack.{}"sv)}, + {DIRECT_ATTACK, EPRO_TEXT("./sound/directattack.{}"sv)}, + {DRAW, EPRO_TEXT("./sound/draw.{}"sv)}, + {SHUFFLE, EPRO_TEXT("./sound/shuffle.{}"sv)}, + {DAMAGE, EPRO_TEXT("./sound/damage.{}"sv)}, + {RECOVER, EPRO_TEXT("./sound/gainlp.{}"sv)}, + {COUNTER_ADD, EPRO_TEXT("./sound/addcounter.{}"sv)}, + {COUNTER_REMOVE, EPRO_TEXT("./sound/removecounter.{}"sv)}, + {COIN, EPRO_TEXT("./sound/coinflip.{}"sv)}, + {DICE, EPRO_TEXT("./sound/diceroll.{}"sv)}, + {NEXT_TURN, EPRO_TEXT("./sound/nextturn.{}"sv)}, + {PHASE, EPRO_TEXT("./sound/phase.{}"sv)}, + {PLAYER_ENTER, EPRO_TEXT("./sound/playerenter.{}"sv)}, + {CHAT, EPRO_TEXT("./sound/chatmessage.{}"sv)} }; const auto extensions = mixer->GetSupportedSoundExtensions(); for(const auto& sound : fx) { @@ -125,9 +125,9 @@ void SoundManager::RefreshBGMDir(epro::path_stringview path, BGM scene) { void SoundManager::RefreshChantsList() { #ifdef BACKEND static constexpr std::pair types[]{ - {CHANT::SUMMON, EPRO_TEXT("summon"_sv)}, - {CHANT::ATTACK, EPRO_TEXT("attack"_sv)}, - {CHANT::ACTIVATE, EPRO_TEXT("activate"_sv)} + {CHANT::SUMMON, EPRO_TEXT("summon"sv)}, + {CHANT::ATTACK, EPRO_TEXT("attack"sv)}, + {CHANT::ACTIVATE, EPRO_TEXT("activate"sv)} }; ChantsList.clear(); for (const auto& chantType : types) { diff --git a/gframe/text_types.h b/gframe/text_types.h index 01b65d459..bdb10787d 100644 --- a/gframe/text_types.h +++ b/gframe/text_types.h @@ -2,8 +2,6 @@ #define TEXT_TYPES_H_ #include #include "fmt.h" -#define nssv_CONFIG_SELECT_STRING_VIEW 1 -#include "nonstd/string_view.hpp" // Double macro to convert the macro-defined int to a character literal #define STR_HELPER(x) #x @@ -17,7 +15,7 @@ using path_char = wchar_t; using path_char = char; #endif // UNICODE using path_string = std::basic_string; -using nonstd::basic_string_view; +using std::basic_string_view; using path_stringview = basic_string_view; using stringview = basic_string_view; using wstringview = basic_string_view; @@ -31,7 +29,7 @@ template<> constexpr epro::wstringview CHAR_T_STRINGVIEW(epro::stringview, epro::wstringview string) { return string; } } -#define CHAR_T_STRINGVIEW(Char, text) epro::Detail::CHAR_T_STRINGVIEW(text ""_sv, L"" text ""_sv) +#define CHAR_T_STRINGVIEW(Char, text) epro::Detail::CHAR_T_STRINGVIEW(text ""sv, L"" text ""sv) } template @@ -43,5 +41,5 @@ bool starts_with(const T1& stringview, const T2& token) { return stringview.size() >= token_sv.size() && memcmp(stringview.data(), token_sv.data(), token_sv.size()) == 0; } }; -using namespace nonstd::literals; +using namespace std::string_view_literals; #endif /* TEXT_TYPES_H_ */ diff --git a/gframe/utils.cpp b/gframe/utils.cpp index fff0b8fae..535a18abe 100644 --- a/gframe/utils.cpp +++ b/gframe/utils.cpp @@ -408,9 +408,9 @@ namespace ygo { continue; } #if EDOPRO_ANDROID - if(dirp->d_name == EPRO_TEXT("."_sv)) + if(dirp->d_name == EPRO_TEXT("."sv)) found_curdir = true; - if(dirp->d_name == EPRO_TEXT(".."_sv)) + if(dirp->d_name == EPRO_TEXT(".."sv)) found_topdir = true; #endif //EDOPRO_ANDROID cb(dirp->d_name, isdir); diff --git a/gframe/utils_gui.cpp b/gframe/utils_gui.cpp index 22ca80236..d283108d6 100644 --- a/gframe/utils_gui.cpp +++ b/gframe/utils_gui.cpp @@ -30,7 +30,7 @@ using CCursorControl = irr::CCursorControl; static inline bool try_guess_wayland() { const char* env = getenv("XDG_SESSION_TYPE"); - return env == nullptr || env != "x11"_sv; + return env == nullptr || env != "x11"sv; } #endif //EDOPRO_WINDOWS diff --git a/gframe/windbot.cpp b/gframe/windbot.cpp index ad4fcd5d7..e81267220 100644 --- a/gframe/windbot.cpp +++ b/gframe/windbot.cpp @@ -118,7 +118,7 @@ std::wstring WindBot::GetLaunchParameters(int port, epro::wstringview pass, bool serialized = true; serialized_databases = base64_encode(databases.dump(-1, ' ', false, nlohmann::detail::error_handler_t::replace)); } - const auto assets_path = Utils::GetAbsolutePath(EPRO_TEXT("./WindBot"_sv)); + const auto assets_path = Utils::GetAbsolutePath(EPRO_TEXT("./WindBot"sv)); const auto override_deck = overridedeck ? epro::format(L" DeckFile=\"{}\"", overridedeck) : L""; return epro::format( L"HostInfo=\"{}\" Deck=\"{}\" Port={} Version={} name=\"[AI] {}\" Chat={} Hand={} DbPaths={}{} AssetPath=\"{}\"",