From 685553f8623134cc33c5ac7f739ce4102f337044 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Wed, 16 Jul 2025 09:29:29 +0200 Subject: [PATCH 01/31] #204-create PCS documentation intermediate commit. --- README.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index edd5347..968ee72 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,33 @@ -# cpp-strings +# Library cpp-strings [![license](http://img.shields.io/github/license/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=lightblue)](https://github.com/schmouk/cpprandlib/license) [![Latest release](http://img.shields.io/github/release/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=success)](https://github.com/schmouk/cpprandlib/releases) [![code_coverage](https://img.shields.io/badge/code_coverage-100%25-success?style=plastic&labelColor=blueviolet)]() [![tests](https://img.shields.io/badge/tests-passing-success?style=plastic&labelColor=blueviolet)] + What if c++ strings where as easy to use as Python strings? + +Copyright © 2023-2025 Philippe Schmouker +contact - ph (dot) schmouker (at) gmail (dot) com + + +--- +## License + + Library cpp-strings + "What if c++ strings where as easy to use as Python strings?" + + Copyright (C) 2023-2025 Philippe Schmouker + contact - ph (dot) schmouker (at) gmail (dot) com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + +--- +## Intro \ No newline at end of file From 7a771e27bf9519856ef1fd4c08befed8392d9206 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Wed, 16 Jul 2025 10:23:50 +0200 Subject: [PATCH 02/31] #204-create PCS documentation intermediate commit. --- README.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 968ee72..ae5e3ac 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,28 @@ What if c++ strings where as easy to use as Python strings? -Copyright © 2023-2025 Philippe Schmouker -contact - ph (dot) schmouker (at) gmail (dot) com +Let's just use c++ strings as are Python ones, with same API or as similar API as possible. +Library **cpp-strings** is fully templated. Just download header file `cppstrings.h` and put it anywhere in your project. Notice: all of its stuff is declared and defined in namespace `pcs` - which stands for **P**ythonic **C**++ **S**trings. + +* The templated class `pcs::CppStringT<>` defines all constructors and methods that implement the equivalent of Python strings API. +* Class `pcs::CppString` specializes the templated class with `char` characters. +* Class `pcs::CppWString` specializes the templated class with `wchar_t` characters. + +**cpp-strings** is implemented with the currently most recent c++ standard available with gcc, clang and msvc c++ compilers, i.e. standard **c++20**. + +* directory `cpp-strings` contains the header file `cppstring.h`. +This is the header file to include in your projects. +* directory `cpp-strings-tests` contains the unit test file `cpp-strings-tests.cpp` +This file tests all the library stuff. It is a valuable code container with so many examples of use of the library, the classes, the methods and the functions it defines. + +The code has been developed using VS2022 IDE. As such, unitary tests have been coded using Microsoft Visual Studio Cpp Unit Test Framework. The related VS project is provided with this library. + +Notice: no clang, gcc or msvc specific declarations or goodies have been use to code library **cpp-strings**. It should then be compilable with any of these compilers. To be able to use it with your project, just ensure that the c++ standard used with you favorite compiler is **c++20**: options `-std=c++20` or +* options `-std=c++20` or `-std=c++latest` for clang and gcc (v. 10 and above), +or option `-std=c++2a` for clang and gcc (v. 9 and earlier); +* options `/std=c++20` or `/std=c++latest` for Visual Studio 2019 and above + +If you want to run the unitary tests, well, use Visual Studio 2022. The Community free version will truly be fine. The vcproject associated with the unit tests is already configured to use the option flag `/std:c++latest` since the implemented code uses a very few but very useful c++23 goodies. --- @@ -30,4 +50,6 @@ contact - ph (dot) schmouker (at) gmail (dot) com --- -## Intro \ No newline at end of file +## Intro + +... document creation still in progress ... From 96c75d67eb008ed2330c7c88291ae57cc8788b60 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Wed, 16 Jul 2025 14:25:39 +0200 Subject: [PATCH 03/31] #204-create PCS documentation intermediate commit. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae5e3ac..efdc8ac 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Library cpp-strings [![license](http://img.shields.io/github/license/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=lightblue)](https://github.com/schmouk/cpprandlib/license) [![Latest release](http://img.shields.io/github/release/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=success)](https://github.com/schmouk/cpprandlib/releases) [![code_coverage](https://img.shields.io/badge/code_coverage-100%25-success?style=plastic&labelColor=blueviolet)]() [![tests](https://img.shields.io/badge/tests-passing-success?style=plastic&labelColor=blueviolet)] +# Library cpp-strings [![license](http://img.shields.io/github/license/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=lightblue)](https://github.com/schmouk/cpprandlib/license) [![Latest release](http://img.shields.io/github/release/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=success)](https://github.com/schmouk/cpprandlib/releases) [![code_coverage](https://img.shields.io/badge/code_coverage-100%25-success?style=plastic&labelColor=blueviolet)]() [![tests](https://img.shields.io/badge/tests-passing-success?style=plastic&labelColor=blueviolet)]() What if c++ strings where as easy to use as Python strings? From 4fda9ec478f95695c11533f0a58ea2ca4ab67e3c Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Wed, 16 Jul 2025 14:26:42 +0200 Subject: [PATCH 04/31] Update README.md intermediate commit. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index efdc8ac..1fdad34 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# Library cpp-strings [![license](http://img.shields.io/github/license/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=lightblue)](https://github.com/schmouk/cpprandlib/license) [![Latest release](http://img.shields.io/github/release/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=success)](https://github.com/schmouk/cpprandlib/releases) [![code_coverage](https://img.shields.io/badge/code_coverage-100%25-success?style=plastic&labelColor=blueviolet)]() [![tests](https://img.shields.io/badge/tests-passing-success?style=plastic&labelColor=blueviolet)]() +# Library cpp-string + [![license](http://img.shields.io/github/license/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=lightblue)](https://github.com/schmouk/cpprandlib/license) [![Latest release](http://img.shields.io/github/release/schmouk/cpp-strings.svg?style=plastic&labelColor=blueviolet&color=success)](https://github.com/schmouk/cpprandlib/releases) [![code_coverage](https://img.shields.io/badge/code_coverage-100%25-success?style=plastic&labelColor=blueviolet)]() [![tests](https://img.shields.io/badge/tests-passing-success?style=plastic&labelColor=blueviolet)]() What if c++ strings where as easy to use as Python strings? From 2e1ad62a454df9cd16009fffe704edce08c30977 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Wed, 16 Jul 2025 14:37:13 +0200 Subject: [PATCH 05/31] #204 intermediate commit. --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1fdad34..23ad29f 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,13 @@ This file tests all the library stuff. It is a valuable code container with so m The code has been developed using VS2022 IDE. As such, unitary tests have been coded using Microsoft Visual Studio Cpp Unit Test Framework. The related VS project is provided with this library. -Notice: no clang, gcc or msvc specific declarations or goodies have been use to code library **cpp-strings**. It should then be compilable with any of these compilers. To be able to use it with your project, just ensure that the c++ standard used with you favorite compiler is **c++20**: options `-std=c++20` or +Notice: no clang, gcc or msvc specific declarations or goodies have been use to code library **cpp-strings**. It should then be compilable with any of these compilers. To be able to use it with your project, just ensure that the c++ standard used with you favorite compiler is **c++20**: * options `-std=c++20` or `-std=c++latest` for clang and gcc (v. 10 and above), or option `-std=c++2a` for clang and gcc (v. 9 and earlier); -* options `/std=c++20` or `/std=c++latest` for Visual Studio 2019 and above +* options `/std=c++20` or `/std=c++latest` for Visual Studio 2019 and later. -If you want to run the unitary tests, well, use Visual Studio 2022. The Community free version will truly be fine. The vcproject associated with the unit tests is already configured to use the option flag `/std:c++latest` since the implemented code uses a very few but very useful c++23 goodies. +If you want to run the unitary tests, well, use the last version of Visual Studio (i.e. VS 2022, by July 2025). The Community free version will truly be fine. +The vcproject associated with the unit tests in **cpp-strings** is already configured to use the option flag `/std:c++latest` since the implemented code uses a very few but very useful c++23 goodies. --- From cac9c07b1de1dbc67c635efc5617e47605aaefaa Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Wed, 16 Jul 2025 19:51:40 +0200 Subject: [PATCH 06/31] #224-generate doxygen documentation Completed. Reviewed. --- cpp-strings/cpp-strings.cfg | 96 + cpp-strings/html/annotated.html | 117 + cpp-strings/html/annotated_dup.js | 13 + cpp-strings/html/classes.html | 117 + .../classpcs_1_1_cpp_string_t-members.html | 235 ++ .../html/classpcs_1_1_cpp_string_t.html | 3645 +++++++++++++++++ cpp-strings/html/classpcs_1_1_cpp_string_t.js | 99 + .../html/classpcs_1_1_cpp_string_t.png | Bin 0 -> 1118 bytes ...ing_t_1_1_not_found_exception-members.html | 108 + ..._cpp_string_t_1_1_not_found_exception.html | 132 + ...1_cpp_string_t_1_1_not_found_exception.png | Bin 0 -> 1461 bytes ..._cpp_string_t_1_1_trans_table-members.html | 126 + ...spcs_1_1_cpp_string_t_1_1_trans_table.html | 836 ++++ ...asspcs_1_1_cpp_string_t_1_1_trans_table.js | 22 + .../html/classpcs_1_1_slice-members.html | 116 + cpp-strings/html/classpcs_1_1_slice.html | 485 +++ cpp-strings/html/classpcs_1_1_slice.js | 13 + cpp-strings/html/classpcs_1_1_slice.png | Bin 0 -> 1565 bytes cpp-strings/html/clipboard.js | 61 + cpp-strings/html/cookie.js | 58 + cpp-strings/html/cppstrings_8h_source.html | 2231 ++++++++++ cpp-strings/html/doxygen.css | 2468 +++++++++++ cpp-strings/html/doxygen.svg | 28 + cpp-strings/html/doxygen_crawl.html | 227 + cpp-strings/html/dynsections.js | 191 + cpp-strings/html/files.html | 107 + cpp-strings/html/files_dup.js | 4 + cpp-strings/html/functions.html | 245 ++ cpp-strings/html/functions_func.html | 245 ++ cpp-strings/html/hierarchy.html | 121 + cpp-strings/html/hierarchy.js | 22 + cpp-strings/html/index.html | 169 + cpp-strings/html/index.js | 6 + cpp-strings/html/jquery.js | 204 + cpp-strings/html/menu.js | 131 + cpp-strings/html/menudata.js | 82 + cpp-strings/html/namespacemembers.html | 159 + cpp-strings/html/namespacemembers_func.html | 153 + cpp-strings/html/namespacemembers_type.html | 103 + cpp-strings/html/namespacepcs.html | 1493 +++++++ cpp-strings/html/namespacepcs.js | 52 + cpp-strings/html/namespaces.html | 107 + cpp-strings/html/namespaces_dup.js | 4 + cpp-strings/html/navtree.css | 327 ++ cpp-strings/html/navtree.js | 899 ++++ cpp-strings/html/navtreedata.js | 60 + cpp-strings/html/navtreeindex0.js | 253 ++ cpp-strings/html/navtreeindex1.js | 102 + cpp-strings/html/search/all_0.js | 7 + cpp-strings/html/search/all_1.js | 5 + cpp-strings/html/search/all_10.js | 12 + cpp-strings/html/search/all_11.js | 4 + cpp-strings/html/search/all_12.js | 4 + cpp-strings/html/search/all_13.js | 11 + cpp-strings/html/search/all_2.js | 5 + cpp-strings/html/search/all_3.js | 4 + cpp-strings/html/search/all_4.js | 15 + cpp-strings/html/search/all_5.js | 7 + cpp-strings/html/search/all_6.js | 6 + cpp-strings/html/search/all_7.js | 4 + cpp-strings/html/search/all_8.js | 50 + cpp-strings/html/search/all_9.js | 4 + cpp-strings/html/search/all_a.js | 9 + cpp-strings/html/search/all_b.js | 4 + cpp-strings/html/search/all_c.js | 9 + cpp-strings/html/search/all_d.js | 5 + cpp-strings/html/search/all_e.js | 16 + cpp-strings/html/search/all_f.js | 22 + cpp-strings/html/search/classes_0.js | 6 + cpp-strings/html/search/classes_1.js | 4 + cpp-strings/html/search/classes_2.js | 10 + cpp-strings/html/search/classes_3.js | 4 + cpp-strings/html/search/functions_0.js | 4 + cpp-strings/html/search/functions_1.js | 9 + cpp-strings/html/search/functions_2.js | 7 + cpp-strings/html/search/functions_3.js | 6 + cpp-strings/html/search/functions_4.js | 4 + cpp-strings/html/search/functions_5.js | 49 + cpp-strings/html/search/functions_6.js | 4 + cpp-strings/html/search/functions_7.js | 6 + cpp-strings/html/search/functions_8.js | 9 + cpp-strings/html/search/functions_9.js | 4 + cpp-strings/html/search/functions_a.js | 14 + cpp-strings/html/search/functions_b.js | 21 + cpp-strings/html/search/functions_c.js | 12 + cpp-strings/html/search/functions_d.js | 4 + cpp-strings/html/search/functions_e.js | 4 + cpp-strings/html/search/functions_f.js | 11 + cpp-strings/html/search/namespaces_0.js | 4 + cpp-strings/html/search/pages_0.js | 7 + cpp-strings/html/search/pages_1.js | 5 + cpp-strings/html/search/pages_2.js | 5 + cpp-strings/html/search/pages_3.js | 4 + cpp-strings/html/search/pages_4.js | 4 + cpp-strings/html/search/pages_5.js | 6 + cpp-strings/html/search/pages_6.js | 5 + cpp-strings/html/search/pages_7.js | 4 + cpp-strings/html/search/search.css | 378 ++ cpp-strings/html/search/search.js | 708 ++++ cpp-strings/html/search/searchdata.js | 30 + cpp-strings/html/search/typedefs_0.js | 5 + .../structpcs_1_1_start_slice-members.html | 119 + .../html/structpcs_1_1_start_slice.html | 235 ++ cpp-strings/html/structpcs_1_1_start_slice.js | 5 + .../html/structpcs_1_1_start_slice.png | Bin 0 -> 620 bytes ...tructpcs_1_1_start_step_slice-members.html | 119 + .../html/structpcs_1_1_start_step_slice.html | 239 ++ .../html/structpcs_1_1_start_step_slice.js | 5 + .../html/structpcs_1_1_start_step_slice.png | Bin 0 -> 678 bytes ...tructpcs_1_1_start_stop_slice-members.html | 119 + .../html/structpcs_1_1_start_stop_slice.html | 239 ++ .../html/structpcs_1_1_start_stop_slice.js | 5 + .../html/structpcs_1_1_start_stop_slice.png | Bin 0 -> 677 bytes .../structpcs_1_1_step_slice-members.html | 119 + .../html/structpcs_1_1_step_slice.html | 235 ++ cpp-strings/html/structpcs_1_1_step_slice.js | 5 + cpp-strings/html/structpcs_1_1_step_slice.png | Bin 0 -> 621 bytes .../structpcs_1_1_stop_slice-members.html | 119 + .../html/structpcs_1_1_stop_slice.html | 235 ++ cpp-strings/html/structpcs_1_1_stop_slice.js | 5 + cpp-strings/html/structpcs_1_1_stop_slice.png | Bin 0 -> 618 bytes ...structpcs_1_1_stop_step_slice-members.html | 119 + .../html/structpcs_1_1_stop_step_slice.html | 239 ++ .../html/structpcs_1_1_stop_step_slice.js | 5 + .../html/structpcs_1_1_stop_step_slice.png | Bin 0 -> 661 bytes cpp-strings/html/tabs.css | 1 + 126 files changed, 20199 insertions(+) create mode 100644 cpp-strings/cpp-strings.cfg create mode 100644 cpp-strings/html/annotated.html create mode 100644 cpp-strings/html/annotated_dup.js create mode 100644 cpp-strings/html/classes.html create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t-members.html create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t.html create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t.js create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t.png create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception-members.html create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.png create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.html create mode 100644 cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.js create mode 100644 cpp-strings/html/classpcs_1_1_slice-members.html create mode 100644 cpp-strings/html/classpcs_1_1_slice.html create mode 100644 cpp-strings/html/classpcs_1_1_slice.js create mode 100644 cpp-strings/html/classpcs_1_1_slice.png create mode 100644 cpp-strings/html/clipboard.js create mode 100644 cpp-strings/html/cookie.js create mode 100644 cpp-strings/html/cppstrings_8h_source.html create mode 100644 cpp-strings/html/doxygen.css create mode 100644 cpp-strings/html/doxygen.svg create mode 100644 cpp-strings/html/doxygen_crawl.html create mode 100644 cpp-strings/html/dynsections.js create mode 100644 cpp-strings/html/files.html create mode 100644 cpp-strings/html/files_dup.js create mode 100644 cpp-strings/html/functions.html create mode 100644 cpp-strings/html/functions_func.html create mode 100644 cpp-strings/html/hierarchy.html create mode 100644 cpp-strings/html/hierarchy.js create mode 100644 cpp-strings/html/index.html create mode 100644 cpp-strings/html/index.js create mode 100644 cpp-strings/html/jquery.js create mode 100644 cpp-strings/html/menu.js create mode 100644 cpp-strings/html/menudata.js create mode 100644 cpp-strings/html/namespacemembers.html create mode 100644 cpp-strings/html/namespacemembers_func.html create mode 100644 cpp-strings/html/namespacemembers_type.html create mode 100644 cpp-strings/html/namespacepcs.html create mode 100644 cpp-strings/html/namespacepcs.js create mode 100644 cpp-strings/html/namespaces.html create mode 100644 cpp-strings/html/namespaces_dup.js create mode 100644 cpp-strings/html/navtree.css create mode 100644 cpp-strings/html/navtree.js create mode 100644 cpp-strings/html/navtreedata.js create mode 100644 cpp-strings/html/navtreeindex0.js create mode 100644 cpp-strings/html/navtreeindex1.js create mode 100644 cpp-strings/html/search/all_0.js create mode 100644 cpp-strings/html/search/all_1.js create mode 100644 cpp-strings/html/search/all_10.js create mode 100644 cpp-strings/html/search/all_11.js create mode 100644 cpp-strings/html/search/all_12.js create mode 100644 cpp-strings/html/search/all_13.js create mode 100644 cpp-strings/html/search/all_2.js create mode 100644 cpp-strings/html/search/all_3.js create mode 100644 cpp-strings/html/search/all_4.js create mode 100644 cpp-strings/html/search/all_5.js create mode 100644 cpp-strings/html/search/all_6.js create mode 100644 cpp-strings/html/search/all_7.js create mode 100644 cpp-strings/html/search/all_8.js create mode 100644 cpp-strings/html/search/all_9.js create mode 100644 cpp-strings/html/search/all_a.js create mode 100644 cpp-strings/html/search/all_b.js create mode 100644 cpp-strings/html/search/all_c.js create mode 100644 cpp-strings/html/search/all_d.js create mode 100644 cpp-strings/html/search/all_e.js create mode 100644 cpp-strings/html/search/all_f.js create mode 100644 cpp-strings/html/search/classes_0.js create mode 100644 cpp-strings/html/search/classes_1.js create mode 100644 cpp-strings/html/search/classes_2.js create mode 100644 cpp-strings/html/search/classes_3.js create mode 100644 cpp-strings/html/search/functions_0.js create mode 100644 cpp-strings/html/search/functions_1.js create mode 100644 cpp-strings/html/search/functions_2.js create mode 100644 cpp-strings/html/search/functions_3.js create mode 100644 cpp-strings/html/search/functions_4.js create mode 100644 cpp-strings/html/search/functions_5.js create mode 100644 cpp-strings/html/search/functions_6.js create mode 100644 cpp-strings/html/search/functions_7.js create mode 100644 cpp-strings/html/search/functions_8.js create mode 100644 cpp-strings/html/search/functions_9.js create mode 100644 cpp-strings/html/search/functions_a.js create mode 100644 cpp-strings/html/search/functions_b.js create mode 100644 cpp-strings/html/search/functions_c.js create mode 100644 cpp-strings/html/search/functions_d.js create mode 100644 cpp-strings/html/search/functions_e.js create mode 100644 cpp-strings/html/search/functions_f.js create mode 100644 cpp-strings/html/search/namespaces_0.js create mode 100644 cpp-strings/html/search/pages_0.js create mode 100644 cpp-strings/html/search/pages_1.js create mode 100644 cpp-strings/html/search/pages_2.js create mode 100644 cpp-strings/html/search/pages_3.js create mode 100644 cpp-strings/html/search/pages_4.js create mode 100644 cpp-strings/html/search/pages_5.js create mode 100644 cpp-strings/html/search/pages_6.js create mode 100644 cpp-strings/html/search/pages_7.js create mode 100644 cpp-strings/html/search/search.css create mode 100644 cpp-strings/html/search/search.js create mode 100644 cpp-strings/html/search/searchdata.js create mode 100644 cpp-strings/html/search/typedefs_0.js create mode 100644 cpp-strings/html/structpcs_1_1_start_slice-members.html create mode 100644 cpp-strings/html/structpcs_1_1_start_slice.html create mode 100644 cpp-strings/html/structpcs_1_1_start_slice.js create mode 100644 cpp-strings/html/structpcs_1_1_start_slice.png create mode 100644 cpp-strings/html/structpcs_1_1_start_step_slice-members.html create mode 100644 cpp-strings/html/structpcs_1_1_start_step_slice.html create mode 100644 cpp-strings/html/structpcs_1_1_start_step_slice.js create mode 100644 cpp-strings/html/structpcs_1_1_start_step_slice.png create mode 100644 cpp-strings/html/structpcs_1_1_start_stop_slice-members.html create mode 100644 cpp-strings/html/structpcs_1_1_start_stop_slice.html create mode 100644 cpp-strings/html/structpcs_1_1_start_stop_slice.js create mode 100644 cpp-strings/html/structpcs_1_1_start_stop_slice.png create mode 100644 cpp-strings/html/structpcs_1_1_step_slice-members.html create mode 100644 cpp-strings/html/structpcs_1_1_step_slice.html create mode 100644 cpp-strings/html/structpcs_1_1_step_slice.js create mode 100644 cpp-strings/html/structpcs_1_1_step_slice.png create mode 100644 cpp-strings/html/structpcs_1_1_stop_slice-members.html create mode 100644 cpp-strings/html/structpcs_1_1_stop_slice.html create mode 100644 cpp-strings/html/structpcs_1_1_stop_slice.js create mode 100644 cpp-strings/html/structpcs_1_1_stop_slice.png create mode 100644 cpp-strings/html/structpcs_1_1_stop_step_slice-members.html create mode 100644 cpp-strings/html/structpcs_1_1_stop_step_slice.html create mode 100644 cpp-strings/html/structpcs_1_1_stop_step_slice.js create mode 100644 cpp-strings/html/structpcs_1_1_stop_step_slice.png create mode 100644 cpp-strings/html/tabs.css diff --git a/cpp-strings/cpp-strings.cfg b/cpp-strings/cpp-strings.cfg new file mode 100644 index 0000000..847ae88 --- /dev/null +++ b/cpp-strings/cpp-strings.cfg @@ -0,0 +1,96 @@ +# Doxyfile 1.14.0 + +# This file describes the settings to be used by the documentation system +# Doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use Doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use Doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = "cpp-strings" +PROJECT_NUMBER = "1.0.0" +PROJECT_BRIEF = "Pythonic c++ strings" +OUTPUT_DIRECTORY = + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +ALWAYS_DETAILED_SEC = YES +FULL_PATH_NAMES = NO +BUILTIN_STL_SUPPORT = YES +TIMESTAMP = DATE ##YES ##NO ##DATETIME ## + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +HIDE_UNDOC_NAMESPACES = NO +SORT_BRIEF_DOCS = YES +WARN_NO_PARAMDOC = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = ./ ../ +INPUT_ENCODING = UTF-8 +USE_MDFILE_AS_MAINPAGE = ../README.md + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_SECTIONS = NO +HTML_CODE_FOLDING = NO ##YES +HTML_COPY_CLIPBOARD = YES +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_TREEVIEW = YES +FULL_SIDEBAR = NO +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO diff --git a/cpp-strings/html/annotated.html b/cpp-strings/html/annotated.html new file mode 100644 index 0000000..cccc0e4 --- /dev/null +++ b/cpp-strings/html/annotated.html @@ -0,0 +1,117 @@ + + + + + + + +cpp-strings: Class List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + +
 Npcs
 CCppStringTThis is the templated base class for all CppString classes
 CNotFoundException
 CTransTableThe internal class of translation tables, used with methods CppStringT::maketrans and CppStringT::translate
 CSliceBase class for slices, with start, stop and step specified values
 CStartSliceBase class for slices, with start, stop and step specified values
 CStartStepSliceStruct of slices with default step values
 CStartStopSliceStruct of slices with default start and stop values
 CStepSliceStruct of slices with default start and step values
 CStopSliceStruct of slices with default stop and step values
 CStopStepSliceStruct of slices with default stop values
+
+
+
+
+ + + + diff --git a/cpp-strings/html/annotated_dup.js b/cpp-strings/html/annotated_dup.js new file mode 100644 index 0000000..328bcbb --- /dev/null +++ b/cpp-strings/html/annotated_dup.js @@ -0,0 +1,13 @@ +var annotated_dup = +[ + [ "pcs", "namespacepcs.html", [ + [ "CppStringT", "classpcs_1_1_cpp_string_t.html", "classpcs_1_1_cpp_string_t" ], + [ "Slice", "classpcs_1_1_slice.html", "classpcs_1_1_slice" ], + [ "StartSlice", "structpcs_1_1_start_slice.html", "structpcs_1_1_start_slice" ], + [ "StartStepSlice", "structpcs_1_1_start_step_slice.html", "structpcs_1_1_start_step_slice" ], + [ "StartStopSlice", "structpcs_1_1_start_stop_slice.html", "structpcs_1_1_start_stop_slice" ], + [ "StepSlice", "structpcs_1_1_step_slice.html", "structpcs_1_1_step_slice" ], + [ "StopSlice", "structpcs_1_1_stop_slice.html", "structpcs_1_1_stop_slice" ], + [ "StopStepSlice", "structpcs_1_1_stop_step_slice.html", "structpcs_1_1_stop_step_slice" ] + ] ] +]; \ No newline at end of file diff --git a/cpp-strings/html/classes.html b/cpp-strings/html/classes.html new file mode 100644 index 0000000..cac03fe --- /dev/null +++ b/cpp-strings/html/classes.html @@ -0,0 +1,117 @@ + + + + + + + +cpp-strings: Class Index + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+ +
+
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t-members.html b/cpp-strings/html/classpcs_1_1_cpp_string_t-members.html new file mode 100644 index 0000000..184420d --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_cpp_string_t-members.html @@ -0,0 +1,235 @@ + + + + + + + +cpp-strings: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pcs::CppStringT< CharT, TraitsT, AllocatorT > Member List
+
+
+ +

This is the complete list of members for pcs::CppStringT< CharT, TraitsT, AllocatorT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
allocator_type typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
capitalize() noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
center(const size_type width, const value_type fillch=value_type(' ')) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
const_iterator typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
const_pointer typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
const_reference typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
const_reverse_iterator typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
contains(const CppStringT &substr) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
contains_n(const CppStringT &sub, const size_type start, const size_type count=-1) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
count(const CppStringT &sub, const size_type start=0, const size_type end=-1) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
count_n(const CppStringT &sub, const size_type start, const size_type length) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
count_n(const CppStringT &sub, const size_type length) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT() (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const CppStringT &other) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const CppStringT &other, const AllocatorT &alloc) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(CppStringT &&other) noexcept (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(CppStringT &&other, const AllocatorT &alloc) noexcept (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(MyBaseClass::size_type count, CharT ch) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const CppStringT &other, size_type pos) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const CppStringT &other, size_type pos, size_type count) noexcept (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const CharT *s) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const CharT *s, size_type count) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(std::initializer_list< CharT > ilist) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const CharT ch) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const MyBaseClass &other) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(const MyBaseClass &other, const AllocatorT &alloc) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(MyBaseClass &&other) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(MyBaseClass &&other, const AllocatorT &alloc) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(InputIt first, InputIt last) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
CppStringT(StringViewLike &svl) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inlineexplicit
CppStringT(StringViewLike &svl, size_type pos, size_type n) (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
difference_type typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
endswith(const CppStringT &suffix, const size_type start, const size_type end) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
endswith(const CppStringT &suffix, const size_type end) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
endswith(const CppStringT &suffix) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
endswith(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type end) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
endswith_n(const CppStringT &suffix, const size_type start, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
endswith_n(const CppStringT &suffix, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
endswith_n(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
expand_tabs(const size_type tabsize=8) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
find(const CppStringT &sub, const size_type start=0, const size_type end=-1) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
find_n(const CppStringT &sub, const size_type start, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
find_n(const CppStringT &sub, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
format(const std::basic_format_string< T, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
format(const std::basic_format_string< char, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
format(const std::basic_format_string< wchar_t, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
index(const CppStringT &sub, const size_type start=0, const size_type end=-1) constpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
index_n(const CppStringT &sub, const size_type start, const size_type count) constpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
index_n(const CppStringT &sub, const size_type count) constpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
is_words_sep() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isalnum() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isalpha() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isascii() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isdecimal() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isdigit() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isidentifier() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
islower() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isnumeric() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isprintable() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
ispunctuation() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isspace() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
istitle() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
isupper() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
iterator typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
join(const std::array< CppStringT, N > &strs) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
join(const std::vector< CppStringT > &strs) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
join(const CppStringT &first, const NextCppStringsT &... others) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
join(const CppStringT &s) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
join() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
ljust(const size_type width, const value_type fillch=value_type(' ')) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
lower() noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
lower(const value_type ch) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inlinestatic
lstrip(const CppStringT &removedchars) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
lstrip() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
MyBaseClass typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
operator()(Slice< IntT > slice) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
operator()(const long long start, const long long stop, const long long step=1) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
operator*(std::int64_t count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
operator=(const CppStringT &) noexcept=defaultpcs::CppStringT< CharT, TraitsT, AllocatorT >
operator=(CppStringT &&) noexcept=defaultpcs::CppStringT< CharT, TraitsT, AllocatorT >
partition(const CppStringT &sep) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
pointer typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
reference typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
removeprefix(const CppStringT &prefix) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
removesuffix(const CppStringT &suffix) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
replace(const CppStringT &old, const CppStringT &new_, size_type count=-1) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
reverse_iterator typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
rfind(const CppStringT &sub, const size_type start, const size_type end) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rfind(const CppStringT &sub, const size_type start) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rfind(const CppStringT &sub) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rfind_n(const CppStringT &sub, const size_type start, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rfind_n(const CppStringT &sub, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rindex(const CppStringT &sub, const size_type start, const size_type end) constpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rindex(const CppStringT &sub, const size_type start) constpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rindex(const CppStringT &sub) constpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rindex_n(const CppStringT &sub, const size_type start, const size_type count) constpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rindex_n(const CppStringT &sub, const size_type count) constpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rjust(const size_type width, const value_type fillch=value_type(' ')) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rpartition(const CppStringT &sep) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rsplit() noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rsplit(const CppStringT &sep) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rsplit(const size_type maxsplit) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rsplit(const CppStringT &sep, const size_type maxsplit) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rstrip(const CppStringT &removedchars) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
rstrip() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
size_type typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
split() noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
split(const CppStringT &sep) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
split(const size_type maxsplit) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
split(const CppStringT &sep, const size_type maxsplit) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
splitlines(const bool keep_end=false) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
startswith(const CppStringT &prefix, const size_type start, const size_type end) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
startswith(const CppStringT &prefix, const size_type start) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
startswith(const CppStringT &prefix) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
startswith(const std::initializer_list< CppStringT > &prefixes, const size_type start, const size_type end) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
startswith_n(const CppStringT &prefix, const size_type start, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
startswith_n(const CppStringT &prefix, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
startswith_n(const std::initializer_list< CppStringT > &prefix, const size_type start, const size_type count) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
strip(const CppStringT &removedchars) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
strip() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
substr(const size_type start, const size_type count=-1) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
swapcase() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
title() const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
traits_type typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
translate(TransTable &table) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
upper() noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
upper(const value_type ch) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inlinestatic
value_type typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >
zfill(const size_type width) const noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >inline
~CppStringT() noexcept=default (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >)pcs::CppStringT< CharT, TraitsT, AllocatorT >inline
+
+
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t.html b/cpp-strings/html/classpcs_1_1_cpp_string_t.html new file mode 100644 index 0000000..b8ec5fe --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_cpp_string_t.html @@ -0,0 +1,3645 @@ + + + + + + + +cpp-strings: pcs::CppStringT< CharT, TraitsT, AllocatorT > Class Template Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pcs::CppStringT< CharT, TraitsT, AllocatorT > Class Template Reference
+
+
+ +

This is the templated base class for all CppString classes. + More...

+ +

#include <cppstrings.h>

+
+Inheritance diagram for pcs::CppStringT< CharT, TraitsT, AllocatorT >:
+
+
+ +
+ + + + + +

+Classes

class  NotFoundException
class  TransTable
 The internal class of translation tables, used with methods CppStringT::maketrans and CppStringT::translate. More...
+ + + + + + + + + + + + + + + +

+Public Types

+using allocator_type = MyBaseClass::allocator_type
+using const_iterator = MyBaseClass::const_iterator
+using const_pointer = MyBaseClass::const_pointer
+using const_reference = MyBaseClass::const_reference
+using const_reverse_iterator = MyBaseClass::const_reverse_iterator
+using difference_type = MyBaseClass::difference_type
+using iterator = MyBaseClass::iterator
+using MyBaseClass = std::basic_string<CharT, TraitsT, AllocatorT>
+using pointer = MyBaseClass::pointer
+using reference = MyBaseClass::reference
+using reverse_iterator = MyBaseClass::reverse_iterator
+using size_type = MyBaseClass::size_type
+using traits_type = MyBaseClass::traits_type
+using value_type = MyBaseClass::value_type
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

CppStringT capitalize () noexcept
 Returns a copy of the string with its first character capitalized and the rest lowercased.
CppStringT center (const size_type width, const value_type fillch=value_type(' ')) const noexcept
 Returns a copy of the string centered in a string of length width.
constexpr bool contains (const CppStringT &substr) const noexcept
 Returns true if this string contains the passed string, or false otherwise.
constexpr bool contains_n (const CppStringT &sub, const size_type start, const size_type count=-1) const noexcept
 Returns true if the passed string is found within the slice str[start:start+count-1], or false otherwise.
constexpr size_type count (const CppStringT &sub, const size_type start=0, const size_type end=-1) const noexcept
 Returns the number of non-overlapping occurrences of substring sub in the range [start, end].
constexpr size_type count_n (const CppStringT &sub, const size_type length) const noexcept
 Returns the number of non-overlapping occurrences of substring sub in the range [0, length-1].
constexpr size_type count_n (const CppStringT &sub, const size_type start, const size_type length) const noexcept
 Returns the number of non-overlapping occurrences of substring sub in the range [start, start+length-1].
CppStringT (const CharT *s)
CppStringT (const CharT *s, size_type count)
CppStringT (const CharT ch)
CppStringT (const CppStringT &other)
CppStringT (const CppStringT &other, const AllocatorT &alloc)
CppStringT (const CppStringT &other, size_type pos)
CppStringT (const CppStringT &other, size_type pos, size_type count) noexcept
CppStringT (const MyBaseClass &other)
CppStringT (const MyBaseClass &other, const AllocatorT &alloc)
CppStringT (CppStringT &&other) noexcept
CppStringT (CppStringT &&other, const AllocatorT &alloc) noexcept
+template<class InputIt>
 CppStringT (InputIt first, InputIt last)
CppStringT (MyBaseClass &&other)
CppStringT (MyBaseClass &&other, const AllocatorT &alloc)
CppStringT (MyBaseClass::size_type count, CharT ch)
CppStringT (std::initializer_list< CharT > ilist)
+template<class StringViewLike>
 CppStringT (StringViewLike &svl)
+template<class StringViewLike>
 CppStringT (StringViewLike &svl, size_type pos, size_type n)
const bool endswith (const CppStringT &suffix) const noexcept
 Returns true if the string ends with the specified suffix, otherwise returns false. Test runs on the whole string.
const bool endswith (const CppStringT &suffix, const size_type end) const noexcept
 Returns true if the string ends with the specified suffix, otherwise returns false. Test begins at start of string and stops at end position.
const bool endswith (const CppStringT &suffix, const size_type start, const size_type end) const noexcept
 Returns true if the string ends with the specified suffix, otherwise returns false. Test begins at start position and stops at end position.
const bool endswith (const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type end) const noexcept
 Returns true if the string ends with any of the specified suffixes, otherwise returns false. Test begins at start position and stops at end position.
const bool endswith_n (const CppStringT &suffix, const size_type count) const noexcept
 Returns true if the string ends with the specified suffix, otherwise returns false. Test begins at position 0 and stops after count positions.
const bool endswith_n (const CppStringT &suffix, const size_type start, const size_type count) const noexcept
 Returns true if the string ends with the specified suffix, otherwise returns false. Test begins at start position and stops after count positions.
const bool endswith_n (const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type count) const noexcept
 Returns true if the string ends with any of the specified suffixes, otherwise returns false. Test begins at start position and stops after count positions.
CppStringT expand_tabs (const size_type tabsize=8) const noexcept
 Returns a copy of the string where all tab characters are replaced by one or more spaces, depending on the current column and the given tab size.
constexpr size_type find (const CppStringT &sub, const size_type start=0, const size_type end=-1) const noexcept
 Returns the lowest index in the string where substring sub is found within the slice str[start:end], or -1 (i.e. 'npos') if sub is not found.
constexpr size_type find_n (const CppStringT &sub, const size_type count) const noexcept
 Returns the lowest index in the string where substring sub is found within the slice str[0:count-1], or -1 (i.e. 'npos') if sub is not found.
constexpr size_type find_n (const CppStringT &sub, const size_type start, const size_type count) const noexcept
 Returns the lowest index in the string where substring sub is found within the slice str[start:start+count-1], or -1 (i.e. 'npos') if sub is not found.
template<class... ArgsT>
CppStringTformat (const std::basic_format_string< char, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
template<typename T, class... ArgsT>
CppStringTformat (const std::basic_format_string< T, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
 Formats this string according to c++20 std::format() specification. Returns this string.
template<class... ArgsT>
CppStringTformat (const std::basic_format_string< wchar_t, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
constexpr size_type index (const CppStringT &sub, const size_type start=0, const size_type end=-1) const
 Like find(const CppStringT&), but raises NotFoundException when the substring sub is not found.
constexpr size_type index_n (const CppStringT &sub, const size_type count) const
 Like find_n(sub, count), but raises NotFoundException when the substring is not found.
constexpr size_type index_n (const CppStringT &sub, const size_type start, const size_type count) const
 Like find_n(sub, start, count), but raises NotFoundException when the substring is not found.
const bool is_words_sep () const noexcept
 Returns true if there are only whitespace and punctuation characters in the string and there is at least one character, or false otherwise.
const bool isalnum () const noexcept
 Returns true if all characters in the string are alphanumeric and there is at least one character, or false otherwise.
const bool isalpha () const noexcept
 Returns true if all characters in the string are alphabetic and there is at least one character, or false otherwise.
const bool isascii () const noexcept
 Returns true if the string is empty or all characters in the string are ASCII, or false otherwise.
const bool isdecimal () const noexcept
 Returns true if all characters in the string are decimal characters and there is at least one character, or false otherwise.
const bool isdigit () const noexcept
 Returns true if all characters in the string are digits and there is at least one character, or false otherwise.
const bool isidentifier () const noexcept
 Returns true if the string is not empty and is a valid identifier according to the language definition, or false otherwise.
const bool islower () const noexcept
 Returns true if all cased characters in the string are lowercase and there is at least one cased character, or false otherwise.
const bool isnumeric () const noexcept
 Returns true if all characters in the string are numeric characters, and there is at least one character, or false otherwise.
const bool isprintable () const noexcept
 Returns true if all characters in the string are printable or if the string is empty, or false otherwise.
const bool ispunctuation () const noexcept
 Returns true if the string contains only one character and if this character belongs to the ASCII punctuation set.
const bool isspace () const noexcept
 Returns true if there are only whitespace characters in the string and there is at least one character, or false otherwise.
const bool istitle () const noexcept
 Returns true if the string is a titlecased string and there is at least one character, or false otherwise.
const bool isupper () const noexcept
 Returns true if all cased characters in the string are uppercase and there is at least one cased character, or false otherwise.
const CppStringT join () const noexcept
 Empty parameters list signature. Returns a copy of current string.
template<class... NextCppStringsT>
+requires (sizeof...(others) > 0)
CppStringT join (const CppStringT &first, const NextCppStringsT &... others) const noexcept
 Returns a string which is the concatenation of the strings in the parameters list.
CppStringT join (const CppStringT &s) const noexcept
 Single parameter signature. Returns a copy of this parameter.
template<const std::size_t N>
CppStringT join (const std::array< CppStringT, N > &strs) const noexcept
 Returns a string which is the concatenation of the strings in the array parameter.
CppStringT join (const std::vector< CppStringT > &strs) const noexcept
 Returns a string which is the concatenation of the strings in the vector parameter.
CppStringT ljust (const size_type width, const value_type fillch=value_type(' ')) const noexcept
 Returns the string left justified in a string of length width.
CppStringTlower () noexcept
 In-place replaces all characters of the string with their lowercase conversion. Returns a reference to string.
CppStringT lstrip () const noexcept
 Returns a copy of the string with leading whitespaces removed.
CppStringT lstrip (const CppStringT &removedchars) const noexcept
 Returns a copy of the string with leading characters removed.
CppStringT operator() (const long long start, const long long stop, const long long step=1) const noexcept
 Generates a new string according to the specified slicing values.
template<typename IntT>
+requires std::is_signed_v<IntT>
CppStringT operator() (Slice< IntT > slice) const noexcept
 Generates a new string according to the specified slice.
CppStringT operator* (std::int64_t count) const noexcept
 Generates a new string with count times the content of this string.
CppStringToperator= (const CppStringT &) noexcept=default
 Default copy assignment.
CppStringToperator= (CppStringT &&) noexcept=default
 Default move assignment.
std::vector< CppStringTpartition (const CppStringT &sep) const noexcept
 Splits the string at the first occurrence of sep, and returns a 3-items vector containing the part before the separator, the separator itself, and the part after the separator.
CppStringT removeprefix (const CppStringT &prefix) const noexcept
 If the string starts with the prefix string, returns a new string with the prefix removed. Otherwise, returns a copy of the original string.
CppStringT removesuffix (const CppStringT &suffix) const noexcept
 If the string ends with the suffix string, returns a new string with the suffix removed. Otherwise, returns a copy of the original string.
CppStringT replace (const CppStringT &old, const CppStringT &new_, size_type count=-1) const noexcept
 Returns a copy of the string with first count occurrences of substring 'old' replaced by 'new_'.
constexpr size_type rfind (const CppStringT &sub) const noexcept
 Returns the highest index in the string where C-substring sub is found in the whole string, or -1 (i.e. 'npos') if sub is not found.
constexpr size_type rfind (const CppStringT &sub, const size_type start) const noexcept
 Returns the highest index in the string where substring sub is found starting at start position in string, or -1 (i.e. 'npos') if sub is not found.
constexpr size_type rfind (const CppStringT &sub, const size_type start, const size_type end) const noexcept
 Returns the highest index in the string where substring sub is found within the slice str[start:end], or -1 (i.e. 'npos') if sub is not found.
constexpr size_type rfind_n (const CppStringT &sub, const size_type count) const noexcept
 Returns the highest index in the string where substring sub is found within the slice str[0:count-1], or -1 (i.e. 'npos') if sub is not found.
constexpr size_type rfind_n (const CppStringT &sub, const size_type start, const size_type count) const noexcept
 Returns the highest index in the string where substring sub is found within the slice str[start:start+count-1], or -1 (i.e. 'npos') if sub is not found.
constexpr size_type rindex (const CppStringT &sub) const
 Like rfind(sub), but raises NotFoundException when the substring is not found.
constexpr size_type rindex (const CppStringT &sub, const size_type start) const
 Like rfind(sub, start), but raises NotFoundException when the substring is not found.
constexpr size_type rindex (const CppStringT &sub, const size_type start, const size_type end) const
 Like rfind(sub, start, end), but raises NotFoundException when the substring is not found.
constexpr size_type rindex_n (const CppStringT &sub, const size_type count) const
 Like rfind_n(sub, count), but raises NotFoundException when the substring is not found.
constexpr size_type rindex_n (const CppStringT &sub, const size_type start, const size_type count) const
 Like rfind_n(sub, start, count), but raises NotFoundException when the substring is not found.
CppStringT rjust (const size_type width, const value_type fillch=value_type(' ')) const noexcept
 Returns the string right justified in a string of length width.
std::vector< CppStringTrpartition (const CppStringT &sep) const noexcept
 Splits the string at the last occurrence of sep, and returns a 3-items vector containing the part before the separator, the separator itself, and the part after the separator.
std::vector< CppStringTrsplit () noexcept
 Returns a vector of the words in the whole string, as seperated with whitespace strings.
std::vector< CppStringTrsplit (const CppStringT &sep) noexcept
 Returns a vector of the words in the whole string, using sep as the delimiter string.
std::vector< CppStringTrsplit (const CppStringT &sep, const size_type maxsplit) noexcept
 Returns a vector of the words in the string, using sep as the delimiter string. At most maxsplit splits are done, the rightmost ones.
std::vector< CppStringTrsplit (const size_type maxsplit) noexcept
 Returns a vector of the words in the string, as seperated with whitespace strings. At most maxsplit splits are done, the rightmost ones.
CppStringT rstrip () const noexcept
 Returns a copy of the string with trailing whitespaces removed.
CppStringT rstrip (const CppStringT &removedchars) const noexcept
 Returns a copy of the string with trailing characters removed.
std::vector< CppStringTsplit () noexcept
 Returns a vector of the words in the whole string, as seperated with whitespace strings.
std::vector< CppStringTsplit (const CppStringT &sep) noexcept
 Returns a vector of the words in the whole string, using sep as the delimiter string.
std::vector< CppStringTsplit (const CppStringT &sep, const size_type maxsplit) noexcept
 Returns a vector of the words in the string, using sep as the delimiter string. At most maxsplit splits are done, the leftmost ones.
std::vector< CppStringTsplit (const size_type maxsplit) noexcept
 Returns a vector of the words in the string, as seperated with whitespace strings. At most maxsplit splits are done, the leftmost ones.
std::vector< CppStringTsplitlines (const bool keep_end=false) const noexcept
 Return a list of the lines in the string, breaking at line boundaries.
const bool startswith (const CppStringT &prefix) const noexcept
 Returns true if the string starts with the specified prefix, otherwise returns false. Test runs on the whole string.
const bool startswith (const CppStringT &prefix, const size_type start) const noexcept
 Returns true if the string starts with the specified prefix, otherwise returns false. Test begins at start position and stops at end of string.
const bool startswith (const CppStringT &prefix, const size_type start, const size_type end) const noexcept
 Returns true if the string starts with the specified prefix, otherwise returns false. Test begins at start position and stops at end position.
const bool startswith (const std::initializer_list< CppStringT > &prefixes, const size_type start, const size_type end) const noexcept
 Returns true if the string starts with any of the specified prefixes, otherwise returns false. Test begins at start position and stops at end of string.
const bool startswith_n (const CppStringT &prefix, const size_type count) const noexcept
 Returns true if the string starts with the specified suffix, otherwise returns false. Test begins at position 0 and stops after count positions.
const bool startswith_n (const CppStringT &prefix, const size_type start, const size_type count) const noexcept
 Returns true if the string starts with the specified suffix, otherwise returns false. Test begins at start position and stops after count positions.
const bool startswith_n (const std::initializer_list< CppStringT > &prefix, const size_type start, const size_type count) const noexcept
 Returns true if the string starts with any of the specified suffixes, otherwise returns false. Test begins at start position and stops after count positions.
CppStringT strip () const noexcept
 Returns a copy of the string with the leading and trailing whitespaces removed.
CppStringT strip (const CppStringT &removedchars) const noexcept
 Returns a copy of the string with the leading and trailing characters removed.
CppStringT substr (const size_type start, const size_type count=-1) const noexcept
 Returns a copy of the string, starting at index start and ending after count characters.
CppStringT swapcase () const noexcept
 Returns a copy of the string with uppercase characters converted to lowercase and vice versa.
CppStringT title () const noexcept
 Returns a titlecased copy of the string where words start with an uppercase character and the remaining characters are lowercase.
CppStringT translate (TransTable &table) noexcept
 Returns a copy of the string in which each character has been mapped through the given translation table.
CppStringTupper () noexcept
 In-place replaces all characters of the string with their uppercase conversion. Returns a reference to string.
CppStringT zfill (const size_type width) const noexcept
 Returns a copy of the string left filled with ASCII '0' digits to make a string of length width.
+ + + + + +

+Static Public Member Functions

static const value_type lower (const value_type ch) noexcept
 Returns lowercase conversion of the character.
static const value_type upper (const value_type ch) noexcept
 Returns uppercase conversion of the character.
+

Detailed Description

+
template<class CharT, class TraitsT, class AllocatorT>
+class pcs::CppStringT< CharT, TraitsT, AllocatorT >

This is the templated base class for all CppString classes.

+

Users should instantiate any specialization of this base class rather than this base class itself:

+

Member Function Documentation

+ +

◆ capitalize()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::capitalize ()
+
+inlinenoexcept
+
+ +

Returns a copy of the string with its first character capitalized and the rest lowercased.

+ +
+
+ +

◆ center()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::center (const size_type width,
const value_type fillch = value_type(' ') ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string centered in a string of length width.

+

Padding is done using the specified fillchar (default is an ASCII space). A copy of the original string is returned if width is less than or equal to the length of the string. The original string remains unchanged.

+ +
+
+ +

◆ contains()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::contains (const CppStringT< CharT, TraitsT, AllocatorT > & substr) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns true if this string contains the passed string, or false otherwise.

+

This is a c++ implementation of Python keyword 'in' applied to strings.

+ +

Referenced by pcs::CppStringT< char >::contains_n().

+ +
+
+ +

◆ contains_n()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::contains_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start,
const size_type count = -1 ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns true if the passed string is found within the slice str[start:start+count-1], or false otherwise.

+

This is a c++ implementation of Python keyword 'in' applied to Python sliced strings.

+ +
+
+ +

◆ count()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::count (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start = 0,
const size_type end = -1 ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the number of non-overlapping occurrences of substring sub in the range [start, end].

+ +

Referenced by pcs::CppStringT< char >::count_n(), and pcs::CppStringT< char >::count_n().

+ +
+
+ +

◆ count_n() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::count_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type length ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the number of non-overlapping occurrences of substring sub in the range [0, length-1].

+ +
+
+ +

◆ count_n() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::count_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start,
const size_type length ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the number of non-overlapping occurrences of substring sub in the range [start, start+length-1].

+ +
+
+ +

◆ endswith() [1/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::endswith (const CppStringT< CharT, TraitsT, AllocatorT > & suffix) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string ends with the specified suffix, otherwise returns false. Test runs on the whole string.

+ +
+
+ +

◆ endswith() [2/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::endswith (const CppStringT< CharT, TraitsT, AllocatorT > & suffix,
const size_type end ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string ends with the specified suffix, otherwise returns false. Test begins at start of string and stops at end position.

+ +
+
+ +

◆ endswith() [3/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::endswith (const CppStringT< CharT, TraitsT, AllocatorT > & suffix,
const size_type start,
const size_type end ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string ends with the specified suffix, otherwise returns false. Test begins at start position and stops at end position.

+ +

Referenced by pcs::CppStringT< char >::endswith_n(), pcs::CppStringT< char >::endswith_n(), pcs::CppStringT< char >::endswith_n(), and pcs::CppStringT< char >::removesuffix().

+ +
+
+ +

◆ endswith() [4/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::endswith (const std::initializer_list< CppStringT< CharT, TraitsT, AllocatorT > > & suffixes,
const size_type start,
const size_type end ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string ends with any of the specified suffixes, otherwise returns false. Test begins at start position and stops at end position.

+ +
+
+ +

◆ endswith_n() [1/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::endswith_n (const CppStringT< CharT, TraitsT, AllocatorT > & suffix,
const size_type count ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string ends with the specified suffix, otherwise returns false. Test begins at position 0 and stops after count positions.

+ +
+
+ +

◆ endswith_n() [2/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::endswith_n (const CppStringT< CharT, TraitsT, AllocatorT > & suffix,
const size_type start,
const size_type count ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string ends with the specified suffix, otherwise returns false. Test begins at start position and stops after count positions.

+ +
+
+ +

◆ endswith_n() [3/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::endswith_n (const std::initializer_list< CppStringT< CharT, TraitsT, AllocatorT > > & suffixes,
const size_type start,
const size_type count ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string ends with any of the specified suffixes, otherwise returns false. Test begins at start position and stops after count positions.

+ +
+
+ +

◆ expand_tabs()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::expand_tabs (const size_type tabsize = 8) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string where all tab characters are replaced by one or more spaces, depending on the current column and the given tab size.

+ +
+
+ +

◆ find()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::find (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start = 0,
const size_type end = -1 ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the lowest index in the string where substring sub is found within the slice str[start:end], or -1 (i.e. 'npos') if sub is not found.

+

Note: this method should be used only if you need to know the position of sub. To check if sub is a substring or not, use the method contains().

+

CAUTION: empty substrings are considered to be in the string if start and end positions are both less than the string size and if start <= end.

+
See also
find_n(), rfind() and rfind_n().
+
+index(), index_n(), rindex() and rindex_n().
+ +

Referenced by pcs::CppStringT< char >::count(), pcs::CppStringT< char >::index(), pcs::CppStringT< char >::partition(), pcs::CppStringT< char >::replace(), and pcs::CppStringT< char >::split().

+ +
+
+ +

◆ find_n() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::find_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type count ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the lowest index in the string where substring sub is found within the slice str[0:count-1], or -1 (i.e. 'npos') if sub is not found.

+

Note: this method should be used only if you need to know the position of sub. To check if sub is a substring or not, use the method contains_n().

+

CAUTION: empty substrings are considered to be in the string if start and end positions are both less than the string size and if start <= end. The returned position is 0.

+
See also
find(), rfind() and rfind_n().
+
+index(), index_n(), rindex() and rindex_n().
+ +
+
+ +

◆ find_n() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::find_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start,
const size_type count ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the lowest index in the string where substring sub is found within the slice str[start:start+count-1], or -1 (i.e. 'npos') if sub is not found.

+

Note: this method should be used only if you need to know the position of sub. To check if sub is a substring or not, use the method contains_n().

+

CAUTION: empty substrings are considered to be in the string if start and end positions are both less than the string size and if start <= end. The returned position is 0.

+
See also
find(), rfind() and rfind_n().
+
+index(), index_n(), rindex() and rindex_n().
+ +

Referenced by pcs::CppStringT< char >::find(), and pcs::CppStringT< char >::find_n().

+ +
+
+ +

◆ format() [1/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<class... ArgsT>
+ + + + + +
+ + + + + + + + + + + +
CppStringT & pcs::CppStringT< CharT, TraitsT, AllocatorT >::format (const std::basic_format_string< char, std::type_identity_t< ArgsT >... > frmt,
ArgsT &&... args )
+
+inline
+
+
Parameters
+ + +
frmtspecialzation for char's
+
+
+ +
+
+ +

◆ format() [2/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<typename T, class... ArgsT>
+ + + + + +
+ + + + + + + + + + + +
CppStringT & pcs::CppStringT< CharT, TraitsT, AllocatorT >::format (const std::basic_format_string< T, std::type_identity_t< ArgsT >... > frmt,
ArgsT &&... args )
+
+inline
+
+ +

Formats this string according to c++20 std::format() specification. Returns this string.

+ +
+
+ +

◆ format() [3/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<class... ArgsT>
+ + + + + +
+ + + + + + + + + + + +
CppStringT & pcs::CppStringT< CharT, TraitsT, AllocatorT >::format (const std::basic_format_string< wchar_t, std::type_identity_t< ArgsT >... > frmt,
ArgsT &&... args )
+
+inline
+
+
Parameters
+ + +
frmtspecialzation for wchar_t's
+
+
+ +
+
+ +

◆ index()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::index (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start = 0,
const size_type end = -1 ) const
+
+inlinenodiscardconstexpr
+
+ +

Like find(const CppStringT&), but raises NotFoundException when the substring sub is not found.

+
See also
index_n(), rindex() and rindex_n().
+
+find(), find_n(), rfind() and rfind_n().
+ +

Referenced by pcs::CppStringT< char >::index_n(), and pcs::CppStringT< char >::index_n().

+ +
+
+ +

◆ index_n() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::index_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type count ) const
+
+inlinenodiscardconstexpr
+
+ +

Like find_n(sub, count), but raises NotFoundException when the substring is not found.

+
See also
index_n(), rindex() and rindex_n().
+
+find(), find_n(), rfind() and rfind_n().
+ +
+
+ +

◆ index_n() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::index_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start,
const size_type count ) const
+
+inlinenodiscardconstexpr
+
+ +

Like find_n(sub, start, count), but raises NotFoundException when the substring is not found.

+
See also
index_n(), rindex() and rindex_n().
+
+find(), find_n(), rfind() and rfind_n().
+ +
+
+ +

◆ is_words_sep()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::is_words_sep () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if there are only whitespace and punctuation characters in the string and there is at least one character, or false otherwise.

+ +
+
+ +

◆ isalnum()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isalnum () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if all characters in the string are alphanumeric and there is at least one character, or false otherwise.

+ +
+
+ +

◆ isalpha()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isalpha () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if all characters in the string are alphabetic and there is at least one character, or false otherwise.

+ +
+
+ +

◆ isascii()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isascii () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string is empty or all characters in the string are ASCII, or false otherwise.

+ +
+
+ +

◆ isdecimal()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isdecimal () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if all characters in the string are decimal characters and there is at least one character, or false otherwise.

+

Decimal characters are those that can be used to form numbers in base 10, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal character is a character in the Unicode General Category “Nd”.

+ +

Referenced by pcs::CppStringT< char >::isdigit(), and pcs::CppStringT< char >::isnumeric().

+ +
+
+ +

◆ isdigit()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isdigit () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if all characters in the string are digits and there is at least one character, or false otherwise.

+

Digits include decimal characters and digits that need special handling, such as the compatibility superscript digits. This covers digits which cannot be used to form numbers in base 10, like the Kharosthi numbers. Formally, a digit is a character that has the property value Numeric_Type=Digit or Numeric_Type =Decimal.

+

CAUTION: current implementation of library cpp-strings does not implement above algorithm. It just returns the same result as 'isdecimal()' which is NOT what Python str library does.

+ +
+
+ +

◆ isidentifier()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isidentifier () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string is not empty and is a valid identifier according to the language definition, or false otherwise.

+

CAUTION: the current implementation of this method does not deal with the proper c++ defintiion of identifiers (see https://en.cppreference.com/w/cpp/language/identifiers and https://www.unicode.org/reports/tr31/#Table_Lexical_Classes_for_Identifiers).

+

While the specification of identifiers in c++ is this one:

+

identifier ::= XID_Start XID_Continue* XID_Start ::= ID_Start XID_Continue* ID_Start ::= <characters derived from the Unicode General_Category of uppercase letters, lowercase letters, titlecase letters, modifier letters, other letters, letter numbers, plus Other_ID_Start, minus Pattern_Syntax and Pattern_White_Space code points> XID_Continue ::= <characters derived from ID_Continue as per Unicode specs Section 5.1, NFKC Modifications (https://www.unicode.org/reports/tr31/#NFKC_Modifications)> ID_Continue ::= ID_Start | <characters having the Unicode General_Category of nonspacing marks, spacing combining marks, decimal number, connector punctuation, plus Other_ID_Continue, minus Pattern_Syntax and Pattern_White_Space code points>

+

the currently implemented rule is this simpler one:

+

identifier ::= ID_Start id_continue* id_continue ::= ID_Start | <decimal number>

+ +
+
+ +

◆ islower()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::islower () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if all cased characters in the string are lowercase and there is at least one cased character, or false otherwise.

+ +
+
+ +

◆ isnumeric()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isnumeric () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if all characters in the string are numeric characters, and there is at least one character, or false otherwise.

+

CAUTION: current implementation just returns isdecimal() result, while the description of isnumeric() should be this one: Numeric characters include digit characters, and all characters that have the Unicode numeric value property. Formally, numeric characters are those with the property value Numeric_Type=Digit, Numeric_Type=Decimal or Numeric_Type=Numeric.

+ +
+
+ +

◆ isprintable()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isprintable () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if all characters in the string are printable or if the string is empty, or false otherwise.

+

Nonprintable characters are those characters defined in the Unicode character database as "Other" or "Separator", excepting the ASCII space (0x20) which is considered printable.

+ +
+
+ +

◆ ispunctuation()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::ispunctuation () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string contains only one character and if this character belongs to the ASCII punctuation set.

+ +
+
+ +

◆ isspace()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isspace () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if there are only whitespace characters in the string and there is at least one character, or false otherwise.

+ +
+
+ +

◆ istitle()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::istitle () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string is a titlecased string and there is at least one character, or false otherwise.

+

For instance uppercase characters may only follow uncased characters and lowercase characters only cased ones.

+

CAUTION: current implementation only tests for uppercase characters following whitespaces and lowercase characters anywhere else.

+ +
+
+ +

◆ isupper()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::isupper () const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if all cased characters in the string are uppercase and there is at least one cased character, or false otherwise.

+ +
+
+ +

◆ join() [1/5]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::join () const
+
+inlinenodiscardnoexcept
+
+ +

Empty parameters list signature. Returns a copy of current string.

+ +

Referenced by pcs::CppStringT< char >::join().

+ +
+
+ +

◆ join() [2/5]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<class... NextCppStringsT>
+requires (sizeof...(others) > 0)
+ + + + + +
+ + + + + + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::join (const CppStringT< CharT, TraitsT, AllocatorT > & first,
const NextCppStringsT &... others ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a string which is the concatenation of the strings in the parameters list.

+

The separator between elements is the string to which this method is applied.

+ +
+
+ +

◆ join() [3/5]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::join (const CppStringT< CharT, TraitsT, AllocatorT > & s) const
+
+inlinenodiscardnoexcept
+
+ +

Single parameter signature. Returns a copy of this parameter.

+ +
+
+ +

◆ join() [4/5]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<const std::size_t N>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::join (const std::array< CppStringT< CharT, TraitsT, AllocatorT >, N > & strs) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a string which is the concatenation of the strings in the array parameter.

+

The separator between elements is the string to which this method is applied.

+ +

Referenced by pcs::CppStringT< char >::title().

+ +
+
+ +

◆ join() [5/5]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::join (const std::vector< CppStringT< CharT, TraitsT, AllocatorT > > & strs) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a string which is the concatenation of the strings in the vector parameter.

+

The separator between elements is the string to which this method is applied.

+ +
+
+ +

◆ ljust()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::ljust (const size_type width,
const value_type fillch = value_type(' ') ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns the string left justified in a string of length width.

+

Padding is done using the specified fillchar (default is an ASCII space). The original string is returned if width is less than or equal to len(s).

+ +

Referenced by pcs::CppStringT< char >::zfill().

+ +
+
+ +

◆ lower() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT & pcs::CppStringT< CharT, TraitsT, AllocatorT >::lower ()
+
+inlinenoexcept
+
+ +

In-place replaces all characters of the string with their lowercase conversion. Returns a reference to string.

+

Notice: uses the currently set std::locale, which is the "C" one by default or any other one as previously set by the user.

+ +

Referenced by pcs::CppStringT< char >::capitalize(), and pcs::CppStringT< char >::lower().

+ +
+
+ +

◆ lower() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const value_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::lower (const value_type ch)
+
+inlinestaticnodiscardnoexcept
+
+ +

Returns lowercase conversion of the character.

+

Notice: uses the currently set std::locale, which is the "C" one by default or any other one as previously set by the user.

+ +
+
+ +

◆ lstrip() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::lstrip () const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string with leading whitespaces removed.

+ +
+
+ +

◆ lstrip() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::lstrip (const CppStringT< CharT, TraitsT, AllocatorT > & removedchars) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string with leading characters removed.

+

The passed string specifies the set of characters to be removed. The chars argument is not a prefix; rather, all combinations of its values are stripped. To remove a prefix, rather call method 'removeprefix()'.

+ +

Referenced by pcs::CppStringT< char >::strip(), and pcs::CppStringT< char >::strip().

+ +
+
+ +

◆ operator()() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::operator() (const long long start,
const long long stop,
const long long step = 1 ) const
+
+inlinenodiscardnoexcept
+
+ +

Generates a new string according to the specified slicing values.

+ +
+
+ +

◆ operator()() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<typename IntT>
+requires std::is_signed_v<IntT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::operator() (Slice< IntT > slice) const
+
+inlinenodiscardnoexcept
+
+ +

Generates a new string according to the specified slice.

+

A slice is a range specified as [start, stop, step]. It may also be specified as [start, stop] in which case step = 1, or as [stop] in wich case start = 0 and step = 1. Values may be negative: negative step means reverse running and negative start or stop is relative to the end of the string. Notice: the stop value specifies an out of bounds index.

See also
class Slice and all its inheriting classes.
+ +
+
+ +

◆ operator*()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::operator* (std::int64_t count) const
+
+inlinenodiscardnoexcept
+
+ +

Generates a new string with count times the content of this string.

+ +
+
+ +

◆ operator=() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT & pcs::CppStringT< CharT, TraitsT, AllocatorT >::operator= (const CppStringT< CharT, TraitsT, AllocatorT > & )
+
+defaultnoexcept
+
+ +

Default copy assignment.

+ +
+
+ +

◆ operator=() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT & pcs::CppStringT< CharT, TraitsT, AllocatorT >::operator= (CppStringT< CharT, TraitsT, AllocatorT > && )
+
+defaultnoexcept
+
+ +

Default move assignment.

+ +
+
+ +

◆ partition()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::partition (const CppStringT< CharT, TraitsT, AllocatorT > & sep) const
+
+inlinenodiscardnoexcept
+
+ +

Splits the string at the first occurrence of sep, and returns a 3-items vector containing the part before the separator, the separator itself, and the part after the separator.

+

If the separator is not found, returns a 3-items vector containing the string itself, followed by two empty strings.

+ +
+
+ +

◆ removeprefix()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::removeprefix (const CppStringT< CharT, TraitsT, AllocatorT > & prefix) const
+
+inlinenodiscardnoexcept
+
+ +

If the string starts with the prefix string, returns a new string with the prefix removed. Otherwise, returns a copy of the original string.

+ +
+
+ +

◆ removesuffix()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::removesuffix (const CppStringT< CharT, TraitsT, AllocatorT > & suffix) const
+
+inlinenodiscardnoexcept
+
+ +

If the string ends with the suffix string, returns a new string with the suffix removed. Otherwise, returns a copy of the original string.

+ +
+
+ +

◆ replace()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::replace (const CppStringT< CharT, TraitsT, AllocatorT > & old,
const CppStringT< CharT, TraitsT, AllocatorT > & new_,
size_type count = -1 ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string with first count occurrences of substring 'old' replaced by 'new_'.

+ +
+
+ +

◆ rfind() [1/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rfind (const CppStringT< CharT, TraitsT, AllocatorT > & sub) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the highest index in the string where C-substring sub is found in the whole string, or -1 (i.e. 'npos') if sub is not found.

+

Note that this is an offset from the start of the string, not the end.

+

Note: this method should be used only if you need to know the position of sub. To check if sub is a substring or not, use the method contains().

+

CAUTION: empty substrings are considered to be in the string if start and end positions are both less than the string size and if start <= end. The returned position is the size of the string.

+
See also
find(), find_n() and rfind_n().
+
+index(), index_n(), rindex() and rindex_n().
+ +
+
+ +

◆ rfind() [2/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rfind (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the highest index in the string where substring sub is found starting at start position in string, or -1 (i.e. 'npos') if sub is not found.

+

Note that this is an offset from the start of the string, not the end.

+

Note: this method should be used only if you need to know the position of sub. To check if sub is a substring or not, use the method contains().

+

CAUTION: empty substrings are considered to be in the string if start and end positions are both less than the string size and if start <= end. The returned position is the size of the string.

+
See also
find(), find_n() and rfind_n().
+
+index(), index_n(), rindex() and rindex_n().
+ +
+
+ +

◆ rfind() [3/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rfind (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start,
const size_type end ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the highest index in the string where substring sub is found within the slice str[start:end], or -1 (i.e. 'npos') if sub is not found.

+

Note that this is an offset from the start of the string, not the end.

+

Note: this method should be used only if you need to know the position of sub. To check if sub is a substring or not, use the method contains().

+

CAUTION: empty substrings are considered to be in the string if start and end positions are both less than the string size and if start <= end. The returned position is the size of the string.

+
See also
find(), find_n() and rfind_n().
+
+index(), index_n(), rindex() and rindex_n().
+ +

Referenced by pcs::CppStringT< char >::rfind(), pcs::CppStringT< char >::rfind(), pcs::CppStringT< char >::rfind_n(), pcs::CppStringT< char >::rfind_n(), pcs::CppStringT< char >::rindex(), pcs::CppStringT< char >::rpartition(), and pcs::CppStringT< char >::rsplit().

+ +
+
+ +

◆ rfind_n() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rfind_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type count ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the highest index in the string where substring sub is found within the slice str[0:count-1], or -1 (i.e. 'npos') if sub is not found.

+

Note: this method should be used only if you need to know the position of sub. To check if sub is a substring or not, use the method contains_n().

+
See also
find(), find_n() and rfind().
+
+index(), index_n(), rindex() and rindex_n().
+ +
+
+ +

◆ rfind_n() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rfind_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start,
const size_type count ) const
+
+inlinenodiscardconstexprnoexcept
+
+ +

Returns the highest index in the string where substring sub is found within the slice str[start:start+count-1], or -1 (i.e. 'npos') if sub is not found.

+

Note: this method should be used only if you need to know the position of sub. To check if sub is a substring or not, use the method contains_n().

+
See also
find(), find_n() and rfind().
+
+index(), index_n(), rindex() and rindex_n().
+ +
+
+ +

◆ rindex() [1/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rindex (const CppStringT< CharT, TraitsT, AllocatorT > & sub) const
+
+inlinenodiscardconstexpr
+
+ +

Like rfind(sub), but raises NotFoundException when the substring is not found.

+
See also
index(), index_n() and rindex_n().
+
+find(), find_n(), rfind() and rfind_n().
+ +
+
+ +

◆ rindex() [2/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rindex (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start ) const
+
+inlinenodiscardconstexpr
+
+ +

Like rfind(sub, start), but raises NotFoundException when the substring is not found.

+
See also
index(), index_n() and rindex_n().
+
+find(), find_n(), rfind() and rfind_n().
+ +
+
+ +

◆ rindex() [3/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rindex (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start,
const size_type end ) const
+
+inlinenodiscardconstexpr
+
+ +

Like rfind(sub, start, end), but raises NotFoundException when the substring is not found.

+
See also
index(), index_n() and rindex_n().
+
+find(), find_n(), rfind() and rfind_n().
+ +

Referenced by pcs::CppStringT< char >::rindex(), pcs::CppStringT< char >::rindex(), pcs::CppStringT< char >::rindex_n(), and pcs::CppStringT< char >::rindex_n().

+ +
+
+ +

◆ rindex_n() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rindex_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type count ) const
+
+inlinenodiscardconstexpr
+
+ +

Like rfind_n(sub, count), but raises NotFoundException when the substring is not found.

+
See also
index_n(), rindex() and rindex_n().
+
+find(), find_n(), rfind() and rfind_n().
+ +
+
+ +

◆ rindex_n() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
size_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::rindex_n (const CppStringT< CharT, TraitsT, AllocatorT > & sub,
const size_type start,
const size_type count ) const
+
+inlinenodiscardconstexpr
+
+ +

Like rfind_n(sub, start, count), but raises NotFoundException when the substring is not found.

+
See also
index_n(), rindex() and rindex_n().
+
+find(), find_n(), rfind() and rfind_n().
+ +
+
+ +

◆ rjust()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::rjust (const size_type width,
const value_type fillch = value_type(' ') ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns the string right justified in a string of length width.

+

Padding is done using the specified fillchar (default is an ASCII space). The original string is returned if width is less than or equal to len(s).

+ +
+
+ +

◆ rpartition()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::rpartition (const CppStringT< CharT, TraitsT, AllocatorT > & sep) const
+
+inlinenodiscardnoexcept
+
+ +

Splits the string at the last occurrence of sep, and returns a 3-items vector containing the part before the separator, the separator itself, and the part after the separator.

+

If the separator is not found, returns a 3-items vector containing the string itself, followed by two empty strings.

+ +
+
+ +

◆ rsplit() [1/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::rsplit ()
+
+inlinenodiscardnoexcept
+
+ +

Returns a vector of the words in the whole string, as seperated with whitespace strings.

+

Notice: consecutive whitespaces are each regarded as a single separator. So, they each separate empty strings.

+ +

Referenced by pcs::CppStringT< char >::rsplit().

+ +
+
+ +

◆ rsplit() [2/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::rsplit (const CppStringT< CharT, TraitsT, AllocatorT > & sep)
+
+inlinenodiscardnoexcept
+
+ +

Returns a vector of the words in the whole string, using sep as the delimiter string.

+ +
+
+ +

◆ rsplit() [3/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::rsplit (const CppStringT< CharT, TraitsT, AllocatorT > & sep,
const size_type maxsplit )
+
+inlinenodiscardnoexcept
+
+ +

Returns a vector of the words in the string, using sep as the delimiter string. At most maxsplit splits are done, the rightmost ones.

+ +
+
+ +

◆ rsplit() [4/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::rsplit (const size_type maxsplit)
+
+inlinenodiscardnoexcept
+
+ +

Returns a vector of the words in the string, as seperated with whitespace strings. At most maxsplit splits are done, the rightmost ones.

+ +
+
+ +

◆ rstrip() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::rstrip () const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string with trailing whitespaces removed.

+ +

Referenced by pcs::CppStringT< char >::strip(), and pcs::CppStringT< char >::strip().

+ +
+
+ +

◆ rstrip() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::rstrip (const CppStringT< CharT, TraitsT, AllocatorT > & removedchars) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string with trailing characters removed.

+

The passed string specifies the set of characters to be removed. The chars argument is not a prefix; rather, all combinations of its values are stripped. To remove a suffix, rather call method 'removesuffix()'.

+ +
+
+ +

◆ split() [1/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::split ()
+
+inlinenodiscardnoexcept
+
+ +

Returns a vector of the words in the whole string, as seperated with whitespace strings.

+

Notice: consecutive whitespaces are each regarded as a single separator. So, they each separate empty strings.

+ +

Referenced by pcs::CppStringT< char >::rsplit(), pcs::CppStringT< char >::rsplit(), pcs::CppStringT< char >::split(), and pcs::CppStringT< char >::title().

+ +
+
+ +

◆ split() [2/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::split (const CppStringT< CharT, TraitsT, AllocatorT > & sep)
+
+inlinenodiscardnoexcept
+
+ +

Returns a vector of the words in the whole string, using sep as the delimiter string.

+

Notice: consecutive delimiters are not grouped together and are deemed to delimit empty strings (for example, "1,,2".split(",") returns {"1", "", "2"}). The sep argument may consist of multiple characters (for example, "1<>2<>3".split("<>") returns {"1", "2", "3"]). Splitting an empty string with a specified separator returns {""}.

+ +
+
+ +

◆ split() [3/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::split (const CppStringT< CharT, TraitsT, AllocatorT > & sep,
const size_type maxsplit )
+
+inlinenodiscardnoexcept
+
+ +

Returns a vector of the words in the string, using sep as the delimiter string. At most maxsplit splits are done, the leftmost ones.

+ +
+
+ +

◆ split() [4/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::split (const size_type maxsplit)
+
+inlinenodiscardnoexcept
+
+ +

Returns a vector of the words in the string, as seperated with whitespace strings. At most maxsplit splits are done, the leftmost ones.

+ +
+
+ +

◆ splitlines()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::vector< CppStringT > pcs::CppStringT< CharT, TraitsT, AllocatorT >::splitlines (const bool keep_end = false) const
+
+inlinenodiscardnoexcept
+
+ +

Return a list of the lines in the string, breaking at line boundaries.

+

Line breaks are not included in the resulting list unless keepends is given and true.

+

This method splits on the following line boundaries. In particular, the boundaries are a superset of universal newlines:
+ Line Feed \r Carriage Return \r
+ Carriage Return + Line Feed \v or \x0b Line Tabulation \f or \x0c Form Feed \x1c File Separator \x1d Group Separator \x1e Record Separator Next separators values, detected by Python method splitlines(), are currently NOT detected by CppStrings \x85 Next Line (C1 Control Code) \u2028 Line Separator \u2029 Paragraph Separator

+ +
+
+ +

◆ startswith() [1/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::startswith (const CppStringT< CharT, TraitsT, AllocatorT > & prefix) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string starts with the specified prefix, otherwise returns false. Test runs on the whole string.

+ +
+
+ +

◆ startswith() [2/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::startswith (const CppStringT< CharT, TraitsT, AllocatorT > & prefix,
const size_type start ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string starts with the specified prefix, otherwise returns false. Test begins at start position and stops at end of string.

+ +
+
+ +

◆ startswith() [3/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::startswith (const CppStringT< CharT, TraitsT, AllocatorT > & prefix,
const size_type start,
const size_type end ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string starts with the specified prefix, otherwise returns false. Test begins at start position and stops at end position.

+ +

Referenced by pcs::CppStringT< char >::removeprefix(), pcs::CppStringT< char >::startswith(), and pcs::CppStringT< char >::startswith_n().

+ +
+
+ +

◆ startswith() [4/4]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::startswith (const std::initializer_list< CppStringT< CharT, TraitsT, AllocatorT > > & prefixes,
const size_type start,
const size_type end ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string starts with any of the specified prefixes, otherwise returns false. Test begins at start position and stops at end of string.

+ +
+
+ +

◆ startswith_n() [1/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::startswith_n (const CppStringT< CharT, TraitsT, AllocatorT > & prefix,
const size_type count ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string starts with the specified suffix, otherwise returns false. Test begins at position 0 and stops after count positions.

+ +
+
+ +

◆ startswith_n() [2/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::startswith_n (const CppStringT< CharT, TraitsT, AllocatorT > & prefix,
const size_type start,
const size_type count ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string starts with the specified suffix, otherwise returns false. Test begins at start position and stops after count positions.

+ +
+
+ +

◆ startswith_n() [3/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
const bool pcs::CppStringT< CharT, TraitsT, AllocatorT >::startswith_n (const std::initializer_list< CppStringT< CharT, TraitsT, AllocatorT > > & prefix,
const size_type start,
const size_type count ) const
+
+inlinenodiscardnoexcept
+
+ +

Returns true if the string starts with any of the specified suffixes, otherwise returns false. Test begins at start position and stops after count positions.

+ +
+
+ +

◆ strip() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::strip () const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string with the leading and trailing whitespaces removed.

+ +
+
+ +

◆ strip() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::strip (const CppStringT< CharT, TraitsT, AllocatorT > & removedchars) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string with the leading and trailing characters removed.

+

The passed string specifies the set of characters to be removed. The chars argument is not a prefix; rather, all combinations of its values are stripped.

+ +
+
+ +

◆ substr()

+ + + +

◆ swapcase()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::swapcase () const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string with uppercase characters converted to lowercase and vice versa.

+

Note that it is not necessarily true that s.swapcase().swapcase() == s.

+ +
+
+ +

◆ title()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::title () const
+
+inlinenodiscardnoexcept
+
+ +

Returns a titlecased copy of the string where words start with an uppercase character and the remaining characters are lowercase.

+ +

Referenced by pcs::CppStringT< char >::istitle().

+ +
+
+ +

◆ translate()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::translate (TransTable & table)
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string in which each character has been mapped through the given translation table.

+

The table must be of type CppStringT::TransTable. When a character to be translated is not available as an entry in the tranlation table, it is set as is in the resulting string.

+ +
+
+ +

◆ upper() [1/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT & pcs::CppStringT< CharT, TraitsT, AllocatorT >::upper ()
+
+inlinenoexcept
+
+ +

In-place replaces all characters of the string with their uppercase conversion. Returns a reference to string.

+

Notice: uses the currently set std::locale, which is the "C" one by default or any other one as previously set by the user.

+ +

Referenced by pcs::CppStringT< char >::upper().

+ +
+
+ +

◆ upper() [2/2]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
const value_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::upper (const value_type ch)
+
+inlinestaticnodiscardnoexcept
+
+ +

Returns uppercase conversion of the character.

+

Notice: uses the currently set std::locale, which is the "C" one by default or any other one as previously set by the user.

+ +
+
+ +

◆ zfill()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
CppStringT pcs::CppStringT< CharT, TraitsT, AllocatorT >::zfill (const size_type width) const
+
+inlinenodiscardnoexcept
+
+ +

Returns a copy of the string left filled with ASCII '0' digits to make a string of length width.

+

A leading sign prefix ('+'/'-') is handled by inserting the padding after the sign character rather than before. The original string is returned if width is less than or equal to len(s).

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t.js b/cpp-strings/html/classpcs_1_1_cpp_string_t.js new file mode 100644 index 0000000..7ed5049 --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_cpp_string_t.js @@ -0,0 +1,99 @@ +var classpcs_1_1_cpp_string_t = +[ + [ "NotFoundException", "classpcs_1_1_cpp_string_t_1_1_not_found_exception.html", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html", "classpcs_1_1_cpp_string_t_1_1_trans_table" ], + [ "capitalize", "classpcs_1_1_cpp_string_t.html#a48a00cca031b9c29d1912508e120a5f6", null ], + [ "center", "classpcs_1_1_cpp_string_t.html#af18311d8608e71627bc85f96581e4dd3", null ], + [ "contains", "classpcs_1_1_cpp_string_t.html#a0674e29327353aabf83d0e207fed31ed", null ], + [ "contains_n", "classpcs_1_1_cpp_string_t.html#a031b05f290f589b2df52bb84252c27c7", null ], + [ "count", "classpcs_1_1_cpp_string_t.html#a7beda74b4d5092845a970d51d01fe4bf", null ], + [ "count_n", "classpcs_1_1_cpp_string_t.html#a59839e3b5a186c2554224dbf4528c1b4", null ], + [ "count_n", "classpcs_1_1_cpp_string_t.html#a76f97d56e1713182d5e85d58cd445d10", null ], + [ "endswith", "classpcs_1_1_cpp_string_t.html#a3e9da0bfa54e84420e81668f6ce7f52c", null ], + [ "endswith", "classpcs_1_1_cpp_string_t.html#a6b23210d7d5eb07c9f942d62cc76b05e", null ], + [ "endswith", "classpcs_1_1_cpp_string_t.html#a42f1e87d7f1903536ee79aa058d5c867", null ], + [ "endswith", "classpcs_1_1_cpp_string_t.html#a87b25fce2a05421efd718c599a784a09", null ], + [ "endswith_n", "classpcs_1_1_cpp_string_t.html#a619935926ef961883e9bbd92b2fc23bd", null ], + [ "endswith_n", "classpcs_1_1_cpp_string_t.html#a7eca5636b598c6fc107452ddd04a2f17", null ], + [ "endswith_n", "classpcs_1_1_cpp_string_t.html#a4fd91047ab0126c823aa391a699e03bf", null ], + [ "expand_tabs", "classpcs_1_1_cpp_string_t.html#a2cc04d5062162ff5f7b6111d6f1e78e8", null ], + [ "find", "classpcs_1_1_cpp_string_t.html#a24c4b7a0f713373cb3287d92289562ad", null ], + [ "find_n", "classpcs_1_1_cpp_string_t.html#a6b0bc87b284120d0d3bfc685984997c0", null ], + [ "find_n", "classpcs_1_1_cpp_string_t.html#ac4c9351bb52eb9a62fa7fb2e2d5f054d", null ], + [ "format", "classpcs_1_1_cpp_string_t.html#a1a89389b38fd6af3ea8db3489dd82f70", null ], + [ "format", "classpcs_1_1_cpp_string_t.html#a5caecc371bf390272283ceb7a15c6c1d", null ], + [ "format", "classpcs_1_1_cpp_string_t.html#a944e066f3a863c354a5613a6eda17374", null ], + [ "index", "classpcs_1_1_cpp_string_t.html#a277a2b8a3b93951ccb94b6bf39daa582", null ], + [ "index_n", "classpcs_1_1_cpp_string_t.html#a19a51054b824add817f30c5ff03effe7", null ], + [ "index_n", "classpcs_1_1_cpp_string_t.html#aee94d4b52483021051b168e776b18569", null ], + [ "is_words_sep", "classpcs_1_1_cpp_string_t.html#a7565e4f2958e485ee2b0815be1faa0fa", null ], + [ "isalnum", "classpcs_1_1_cpp_string_t.html#a8fdf96ffee524d5b795c4aad26ece6ae", null ], + [ "isalpha", "classpcs_1_1_cpp_string_t.html#a447b7c58b4be1cdcba3aedf189acbce7", null ], + [ "isascii", "classpcs_1_1_cpp_string_t.html#a710631f31d4c63c2117e8f4804fad3f2", null ], + [ "isdecimal", "classpcs_1_1_cpp_string_t.html#a0b9d8a55419274e7cfd9badb4df704e3", null ], + [ "isdigit", "classpcs_1_1_cpp_string_t.html#a21316d00180377a3f48910a6c4c43b9c", null ], + [ "isidentifier", "classpcs_1_1_cpp_string_t.html#a91f72d425dbb4c53a066338d30683246", null ], + [ "islower", "classpcs_1_1_cpp_string_t.html#ae4ff448bb92e6499c0a76f7d8e11126c", null ], + [ "isnumeric", "classpcs_1_1_cpp_string_t.html#a578176ed20fd8da965afbcae1d99dd59", null ], + [ "isprintable", "classpcs_1_1_cpp_string_t.html#a6257a1832da550d4be32e9f272e51265", null ], + [ "ispunctuation", "classpcs_1_1_cpp_string_t.html#a2842f3a067fdc674709bed048d64e12d", null ], + [ "isspace", "classpcs_1_1_cpp_string_t.html#a959a8f56bb536f2474ffc649a7ad3290", null ], + [ "istitle", "classpcs_1_1_cpp_string_t.html#ad72611f339c2b9027a72fa26f25748c3", null ], + [ "isupper", "classpcs_1_1_cpp_string_t.html#af2784cbe9655bb8e23fe90375d79e69c", null ], + [ "join", "classpcs_1_1_cpp_string_t.html#aa3523b858357399995e4fb9ec796c96c", null ], + [ "join", "classpcs_1_1_cpp_string_t.html#a545d669bb9296b5695b01ac8680bf3f4", null ], + [ "join", "classpcs_1_1_cpp_string_t.html#a30860a043574996d85c80e49ef618594", null ], + [ "join", "classpcs_1_1_cpp_string_t.html#ac1b427d4cc4c2aed8252b3526b63f1b1", null ], + [ "join", "classpcs_1_1_cpp_string_t.html#a9eed3f6c5e09f98f3d5916cc5b3a4311", null ], + [ "ljust", "classpcs_1_1_cpp_string_t.html#aed96c44c384cab45342122cd7e2f02eb", null ], + [ "lower", "classpcs_1_1_cpp_string_t.html#ad5c765eaa85cb4a3e7a914d55a6a5175", null ], + [ "lstrip", "classpcs_1_1_cpp_string_t.html#ac1ad3018d38f291e6debad8d2de92be1", null ], + [ "lstrip", "classpcs_1_1_cpp_string_t.html#aee6e48d5b478d5bab239f54523d23c15", null ], + [ "operator()", "classpcs_1_1_cpp_string_t.html#a0daec57ccab4601f46e9d1c258407765", null ], + [ "operator()", "classpcs_1_1_cpp_string_t.html#a1fa8862a5f306553d6f0dae7e76fce83", null ], + [ "operator*", "classpcs_1_1_cpp_string_t.html#a0995f5b5a01af3f4a749949e23d0d780", null ], + [ "operator=", "classpcs_1_1_cpp_string_t.html#a30e26a3082ad50d01c7d0d98cb9e9c37", null ], + [ "operator=", "classpcs_1_1_cpp_string_t.html#a810a3a27ee7396f9c472648978327a76", null ], + [ "partition", "classpcs_1_1_cpp_string_t.html#ac5f88b0fc1f33cda23c30cb1f3bc560f", null ], + [ "removeprefix", "classpcs_1_1_cpp_string_t.html#a058704b7f4538ec9e1798c5348d37c7a", null ], + [ "removesuffix", "classpcs_1_1_cpp_string_t.html#ad6a8dc124ab8b7cab1cb328240763ed0", null ], + [ "replace", "classpcs_1_1_cpp_string_t.html#ad4f39683db649aa8a65907268c499f02", null ], + [ "rfind", "classpcs_1_1_cpp_string_t.html#ac00bb6f7d74bfdde0d4cc247e78ab20e", null ], + [ "rfind", "classpcs_1_1_cpp_string_t.html#a9f43f20029596abc1362d1242e68e5db", null ], + [ "rfind", "classpcs_1_1_cpp_string_t.html#af363308ba741b267641e1aa35669d603", null ], + [ "rfind_n", "classpcs_1_1_cpp_string_t.html#a790f663f51dfe6e9e15d4f5f025bf107", null ], + [ "rfind_n", "classpcs_1_1_cpp_string_t.html#a519a292eb3f0790d54a59a201f2d6410", null ], + [ "rindex", "classpcs_1_1_cpp_string_t.html#a546105cc9a8a9d493979c30607092cf1", null ], + [ "rindex", "classpcs_1_1_cpp_string_t.html#a2baca0ddff848de56a7b867f68d3efab", null ], + [ "rindex", "classpcs_1_1_cpp_string_t.html#a6693ec49258c6ac80a7875b3ebf3c916", null ], + [ "rindex_n", "classpcs_1_1_cpp_string_t.html#ac3079cbecbdf4151e66f602f39ece836", null ], + [ "rindex_n", "classpcs_1_1_cpp_string_t.html#afc08a4e91b93710838c8f0d6234e057e", null ], + [ "rjust", "classpcs_1_1_cpp_string_t.html#a61fd4215938ec9f0fce1f885d6bb4a2b", null ], + [ "rpartition", "classpcs_1_1_cpp_string_t.html#a61674ee4e97038d82ea7ecc30b1761f6", null ], + [ "rsplit", "classpcs_1_1_cpp_string_t.html#a8111cd357773d304fbb496571d7ee6be", null ], + [ "rsplit", "classpcs_1_1_cpp_string_t.html#a0419f46de6fa532372f3b97b4927ebab", null ], + [ "rsplit", "classpcs_1_1_cpp_string_t.html#ab0ace502f0b3026fefd2942a1e8a0456", null ], + [ "rsplit", "classpcs_1_1_cpp_string_t.html#a3aa66706e268bd570a0084d70dff5cde", null ], + [ "rstrip", "classpcs_1_1_cpp_string_t.html#a86f8c78b2eeb3541fb6b56b4f4ac237b", null ], + [ "rstrip", "classpcs_1_1_cpp_string_t.html#a89e850d45d6dec167e763cf748a06971", null ], + [ "split", "classpcs_1_1_cpp_string_t.html#a7ca47096b03baa0091c3b0349d210931", null ], + [ "split", "classpcs_1_1_cpp_string_t.html#acf4d923cfed55cfd90cf12651ce0ac3d", null ], + [ "split", "classpcs_1_1_cpp_string_t.html#a55a3fa32de834f644ac28d7c2495fa77", null ], + [ "split", "classpcs_1_1_cpp_string_t.html#a8fa2afe84d7fc26f96bbd55f4266df2a", null ], + [ "splitlines", "classpcs_1_1_cpp_string_t.html#a0bd53df14569c307b5ca50a2e1e62960", null ], + [ "startswith", "classpcs_1_1_cpp_string_t.html#ae2f755ae7903586a2086b7b7f943d96e", null ], + [ "startswith", "classpcs_1_1_cpp_string_t.html#ad2cfcc7bd22736ebd9f91f04e6a42f8c", null ], + [ "startswith", "classpcs_1_1_cpp_string_t.html#a5a131c385a01ccc5410d4cffa55cf700", null ], + [ "startswith", "classpcs_1_1_cpp_string_t.html#a326eb96e19c3559a84af86ff1bf54aa4", null ], + [ "startswith_n", "classpcs_1_1_cpp_string_t.html#ae0865e2c7f8a4871804bf71c1c982dc6", null ], + [ "startswith_n", "classpcs_1_1_cpp_string_t.html#a3b7955f9c7f9452a6a025caaaf0e6d73", null ], + [ "startswith_n", "classpcs_1_1_cpp_string_t.html#ab2b293c5f1b55af52ceb75b8f7e4d42e", null ], + [ "strip", "classpcs_1_1_cpp_string_t.html#a12bc043347f555b4701e0c70d972058d", null ], + [ "strip", "classpcs_1_1_cpp_string_t.html#a02919129cdf158e75eae1e9815a071bf", null ], + [ "substr", "classpcs_1_1_cpp_string_t.html#a9debc70420a3fbc7722e3111aeccd819", null ], + [ "swapcase", "classpcs_1_1_cpp_string_t.html#a6ab02b4d1c8093a5dfc089a45427f63c", null ], + [ "title", "classpcs_1_1_cpp_string_t.html#a179634aafb049e8604ca78f813684a28", null ], + [ "translate", "classpcs_1_1_cpp_string_t.html#a2a8c1e78b93da9a0abe471c7a8d85090", null ], + [ "upper", "classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120", null ], + [ "zfill", "classpcs_1_1_cpp_string_t.html#ad3d2b94f37325096205e399b95e9fc5d", null ] +]; \ No newline at end of file diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t.png b/cpp-strings/html/classpcs_1_1_cpp_string_t.png new file mode 100644 index 0000000000000000000000000000000000000000..ce95fd5e428d02a189c0b34a983445fa0511c0a8 GIT binary patch literal 1118 zcmeAS@N?(olHy`uVBq!ia0y~yU=#+j12~vLB4-l+04eDJpAgso|NjG-FW!7D?LV~K z!a%b?V)~gE4<0-KikqGdTLP5hED7=pW&rZRz?^CJ6$S?8m!2+;Ar*{o=f)O2HsEPq zIGyRc{l{e+zcP0g-FZ`XYi^?33h8#GmHtX!yMnwtrw09UP&|3%gQuFxOD`lmYsQ@T zTe~@KuqD<0ZTgrV&%gHEy#0Uce&r=Tnt!)rN$*LUf{$v#lXyzbf63f>x~lGHl6%-^ z@AnfATl5}#B79@=EobJ*&5t`b=WcxbHn@M!uQir0u6=ws^@+u+ec|8FN4mGIpSfkq z@5TRbx|XQ5zES?s-)hEIet36AUFu7pJAr2>KQZ|AM5D1|`_0z=*drUW*wxJLKJIZZ zvYcIe{g8`J%$te=LF;+tx<>bnBDd@H+%P|vm413j*)h{e(?bp%S)KFzhv?+Pc@}+) zliy{hKKg7fxcdIW<7}lH3qH-ArQf1IfAVUc$IKQ*N;i*BnQzRQ_57HnW{UjmP4##E zr@fl{tF!!|`OG7KQ_icrQx86}V*VV~3-9JyRo!0a-Sd9#O3`b~o93;E)44kF{l3F; zSl4RqxlyPWp3yijT*osYv*1LXel{%8$$p`<>+(CNN!aH)3SCeB9lMF+q7I zL&M8Pm4yrvK(U5MPZoxllQhQrJ3KX)F7eW=UEmRv^+QG2vq%*Q-%a{-vs?9K>Ato5 z&xob-PdDkyymZfI*1sRu79F+UJyAt^a^;K%zH0v6N7wAzJ41fWpR7xV{3ogLz7P8x zu6Z)B;TCGB;D^#Clj~J zUD%oWZpM#4zDH)g>N`25{=kv0?`MmPrat^}?Yh*pa}_Uje41|UEcI)uGl~~0zJ9~_ z=9kHpm!f?h)on@_`aW6n(X#n#zWa6GyS*=(?{8^V!pFVIM}zX&@Be+eWZRl^+!?E6 z-|Hnep8bAqV)^d!yt_vym8|?d&AeA7^P+hAK6#HxPPOcl|DM(N)c^9?W8d>RbDjrJ z`sZ${Hff5N+9VN;nI4n0q4@Q|B~yZe9zW-Qu*}P4^>o1>z> + + + + + + +cpp-strings: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pcs::CppStringT< CharT, TraitsT, AllocatorT >::NotFoundException Member List
+
+ +
+
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html new file mode 100644 index 0000000..a96dad0 --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html @@ -0,0 +1,132 @@ + + + + + + + +cpp-strings: pcs::CppStringT< CharT, TraitsT, AllocatorT >::NotFoundException Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pcs::CppStringT< CharT, TraitsT, AllocatorT >::NotFoundException Class Reference
+
+
+
+Inheritance diagram for pcs::CppStringT< CharT, TraitsT, AllocatorT >::NotFoundException:
+
+
+ +
+ + + +

+Public Types

+using MyBaseClass = std::logic_error
+ + + +

+Public Member Functions

NotFoundException (const char *what_arg)
NotFoundException (const std::string &what_arg)
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.png b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..55751e8d868a3cfc2f306153ef645f7a930d4947 GIT binary patch literal 1461 zcmb_cYfzGD6#lF%HNJJ78rwc^i&~khWg?K4YYLW_A*q$4Zmm{isZieXlEkdDsI8Y4 zTTM-jRVxZb^9H6?l2QiZqG1KBIgaABEYwOw_N$$K?f&fjao+Qscji3LdFITULn7`2 zO&}8h06>BtJ_rB|7;v6#v=WX3c5Un6%YqaT;;Yx|;dFd@KB=Jd=1!NbXTK{JkH32L z3a+CihpXT>qHLpeW(SRtguTqky43_n5oFJ?jJaGD&-G^Z2(lRU1w-SLc5}q3 zsZ6w=>?eL3Bc*m~_!z1M_oQ*U!nA+J3~k=dDs?5aIvyGPRu7H!7KiRE{TN5~CZVY=mSkj{gXBq(^! zLhul>pTLTupk)BQ(xYIJtCi<#N4 zfU5?D<19<`)yP_3@R_j5zi}ZYpg*lj4-0^or zbq0SnHF+L4u?1pXgt;!}l%v$`Dwm-eZzc`r_q2&Oyc-Mi>q<9?7(P$ucPDqh&v+Q` zm~@Z*!{w@}b2B&slPE}1d*OtO*HWv;DB*rGPrio2pSreRcB#z9pE+mzMSlL5d3OIh zr4R7BcLUwv)*}eG{c-W`8hRA$Xla&VI&iBC0=CgN0auQLz$om$yBr|pqrWQD7(=$U z0eJi-Jo&~GF;@t=qMp_>#Nv1^64hWC^H}Vpb_S&(tdbX~A|h38CLL6y-SHO=+vP{83uweKRyfVGjU8z% ziVt75YI>e=dbvk4B-5nMmKjJFnoIz&9=bpnndNeUGI%6 zZoojTxfy>(W-BPdq;5}H-=J4?y`oXGBcas-(?Uz#rdnh(o?Wp@90oz^MqMFeK5^R8 zU&p@NAh_RRL91lnsUOTlfx853tH^|od9|jNk*Tb!owEbAg5gjhjS||#S2dQQ+gQC4 zx^}&8FXg!kjEkyxe<;B|0D0ga5chdc9{kUqu#vW%c>MZzHiiv7*5p+fBK*Mu1YaV) J*5~J6{sFmqy$%2X literal 0 HcmV?d00001 diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html new file mode 100644 index 0000000..19c9850 --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html @@ -0,0 +1,126 @@ + + + + + + + +cpp-strings: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable Member List
+
+
+ +

This is the complete list of members for pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
get_table() noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
key_type typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable
operator=(const TransTable &) noexcept=defaultpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
operator=(TransTable &&) noexcept=defaultpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
operator=(const std::map< key_type, value_type > &trans_table) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
operator[](const key_type ch) noexceptpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const std::map< key_type, value_type > trans_table)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const CppStringT &keys, const CppStringT &values)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const CppStringT &keys, const CppStringT &values, const CppStringT &not_translated)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > &values)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > values, const CppStringT &not_translated)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const CharT *keys, const CharT *values)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const CharT *keys, const CharT *values, const CharT *not_translated)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(Key1It first_key, Key1It last_key, ValueIt first_value, ValueIt last_value, Key2It first_not_translated, Key2It last_not_translated)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const StringViewLike &keys, const StringViewLike &values)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinlineexplicit
TransTable() noexcept=defaultpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(const TransTable &) noexcept=defaultpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
TransTable(TransTable &&) noexcept=defaultpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
value_type typedef (defined in pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable)pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable
~TransTable() noexcept=defaultpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableinline
+
+
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.html b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.html new file mode 100644 index 0000000..b013f68 --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.html @@ -0,0 +1,836 @@ + + + + + + + +cpp-strings: pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable Class Reference
+
+
+ +

The internal class of translation tables, used with methods CppStringT::maketrans and CppStringT::translate. + More...

+ +

#include <cppstrings.h>

+ + + + +

+Public Types

+using key_type = CharT
+using value_type = CppStringT
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

std::map< typename key_type, typename value_type > & get_table () noexcept
 < for tests purposes
TransTableoperator= (const std::map< key_type, value_type > &trans_table) noexcept
 Assignment operator with a standard map.
TransTableoperator= (const TransTable &) noexcept=default
 Default copy assignment.
TransTableoperator= (TransTable &&) noexcept=default
 Default move assignment.
value_type operator[] (const key_type ch) noexcept
 Indexing operator.
 TransTable () noexcept=default
 Default empty constructor.
 TransTable (const CharT *keys, const CharT *values)
 Creates a TransTable from two pointers to null-terminated lists of characters (#6).
 TransTable (const CharT *keys, const CharT *values, const CharT *not_translated)
 Creates a TransTable from three pointers to null-terminated lists of characters (#7).
 TransTable (const CppStringT &keys, const CppStringT &values)
 Creates a TransTable from two strings (#2).
 TransTable (const CppStringT &keys, const CppStringT &values, const CppStringT &not_translated)
 Creates a TransTable from three strings (#3).
 TransTable (const CppStringT &keys, const std::initializer_list< CppStringT > &values)
 Creates a TransTable from a string and an initalization list (#4).
 TransTable (const CppStringT &keys, const std::initializer_list< CppStringT > values, const CppStringT &not_translated)
 Creates a TransTable from a string, an initalization list and a string (#5).
 TransTable (const std::map< key_type, value_type > trans_table)
 Creates a TransTable from a standard map (#1).
template<class StringViewLike>
 TransTable (const StringViewLike &keys, const StringViewLike &values)
 Creates a TransTable from two string views (#10).
 TransTable (const TransTable &) noexcept=default
 Default copy constructor.
template<class Key1It, class ValueIt, class Key2It>
 TransTable (Key1It first_key, Key1It last_key, ValueIt first_value, ValueIt last_value, Key2It first_not_translated, Key2It last_not_translated)
 Creates a TransTable from three containers iterators (#9).
template<class KeyIt, class ValueIt>
 TransTable (KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)
 Creates a TransTable from two containers iterators (#8).
 TransTable (TransTable &&) noexcept=default
 Default move constructor.
 ~TransTable () noexcept=default
 Default descrtuctor.
+

Detailed Description

+
template<class CharT, class TraitsT, class AllocatorT>
+class pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable

The internal class of translation tables, used with methods CppStringT::maketrans and CppStringT::translate.

+

Constructor & Destructor Documentation

+ +

◆ TransTable() [1/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const std::map< key_type, value_type > trans_table)
+
+inline
+
+ +

Creates a TransTable from a standard map (#1).

+ +

Referenced by operator=(), operator=(), operator=(), TransTable(), TransTable(), and ~TransTable().

+ +
+
+ +

◆ TransTable() [2/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const CppStringT & keys,
const CppStringT & values )
+
+inline
+
+ +

Creates a TransTable from two strings (#2).

+

Parameters keys and values must have the same size. The i-th character in key is associated in the translation table with the i-th character in values.

+ +
+
+ +

◆ TransTable() [3/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const CppStringT & keys,
const CppStringT & values,
const CppStringT & not_translated )
+
+inline
+
+ +

Creates a TransTable from three strings (#3).

+

Parameters keys and values must have the same size. The i-th character in key is associated in the translation table with the i -th character in values. Finally, the characters contained in string not_translated are associated in the translation table with the empty string.

+ +
+
+ +

◆ TransTable() [4/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const CppStringT & keys,
const std::initializer_list< CppStringT > & values )
+
+inline
+
+ +

Creates a TransTable from a string and an initalization list (#4).

+

Parameters keys and values must have the same size. The i-th character in key is associated in the translation table with the i-th character in values.

+ +
+
+ +

◆ TransTable() [5/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const CppStringT & keys,
const std::initializer_list< CppStringT > values,
const CppStringT & not_translated )
+
+inline
+
+ +

Creates a TransTable from a string, an initalization list and a string (#5).

+

Parameters keys and values must have the same size. The i-th character in key is associated in the translation table with the i -th character in values. Finally, the characters contained in string not_translated are associated in the translation table with the empty string.

+ +
+
+ +

◆ TransTable() [6/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const CharT * keys,
const CharT * values )
+
+inline
+
+ +

Creates a TransTable from two pointers to null-terminated lists of characters (#6).

+

Parameters keys and values must have the same size. The i-th character in key is associated in the translation table with the i-th character in values.

+ +
+
+ +

◆ TransTable() [7/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const CharT * keys,
const CharT * values,
const CharT * not_translated )
+
+inline
+
+ +

Creates a TransTable from three pointers to null-terminated lists of characters (#7).

+

Parameters keys and values must have the same size. The i-th character in key is associated in the translation table with the i -th entry in values. Finally, the characters contained in string not_translated are associated in the translation table with the empty string.

+ +
+
+ +

◆ TransTable() [8/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<class KeyIt, class ValueIt>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (KeyIt first_key,
KeyIt last_key,
ValueIt first_value,
ValueIt last_value )
+
+inline
+
+ +

Creates a TransTable from two containers iterators (#8).

+

Both containers should have the same size. The i-th character in key is associated in the translation table with the i-th entry in values.

+ +
+
+ +

◆ TransTable() [9/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<class Key1It, class ValueIt, class Key2It>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (Key1It first_key,
Key1It last_key,
ValueIt first_value,
ValueIt last_value,
Key2It first_not_translated,
Key2It last_not_translated )
+
+inline
+
+ +

Creates a TransTable from three containers iterators (#9).

+

Both containers should have the same size. The i-th character in key is associated in the translation table with the i -th character in values. Finally, the characters contained in string not_translated are associated in the translation table with the empty string.

+ +
+
+ +

◆ TransTable() [10/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+
+template<class StringViewLike>
+ + + + + +
+ + + + + + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const StringViewLike & keys,
const StringViewLike & values )
+
+inlineexplicit
+
+ +

Creates a TransTable from two string views (#10).

+

Parameters keys and values must have the same size. The i-th character in key is associated in the translation table with the i-th character in values.

+ +
+
+ +

◆ TransTable() [11/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable ()
+
+inlinedefaultnoexcept
+
+ +

Default empty constructor.

+ +
+
+ +

◆ TransTable() [12/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (const TransTable & )
+
+inlinedefaultnoexcept
+
+ +

Default copy constructor.

+ +

References TransTable().

+ +
+
+ +

◆ TransTable() [13/13]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::TransTable (TransTable && )
+
+inlinedefaultnoexcept
+
+ +

Default move constructor.

+ +

References TransTable().

+ +
+
+ +

◆ ~TransTable()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::~TransTable ()
+
+inlinedefaultnoexcept
+
+ +

Default descrtuctor.

+ +

References TransTable().

+ +
+
+

Member Function Documentation

+ +

◆ get_table()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
std::map< typename key_type, typename value_type > & pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::get_table ()
+
+inlinenoexcept
+
+ +

< for tests purposes

+ +
+
+ +

◆ operator=() [1/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
TransTable & pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::operator= (const std::map< key_type, value_type > & trans_table)
+
+inlinenoexcept
+
+ +

Assignment operator with a standard map.

+ +

References TransTable().

+ +
+
+ +

◆ operator=() [2/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
TransTable & pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::operator= (const TransTable & )
+
+inlinedefaultnoexcept
+
+ +

Default copy assignment.

+ +

References TransTable().

+ +
+
+ +

◆ operator=() [3/3]

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
TransTable & pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::operator= (TransTable && )
+
+inlinedefaultnoexcept
+
+ +

Default move assignment.

+ +

References TransTable().

+ +
+
+ +

◆ operator[]()

+ +
+
+
+template<class CharT, class TraitsT, class AllocatorT>
+ + + + + +
+ + + + + + + +
value_type pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable::operator[] (const key_type ch)
+
+inlinenodiscardnoexcept
+
+ +

Indexing operator.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.js b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.js new file mode 100644 index 0000000..0e992a7 --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.js @@ -0,0 +1,22 @@ +var classpcs_1_1_cpp_string_t_1_1_trans_table = +[ + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1fea49a165ebb7cda36c1bfdcbe95ee0", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a5efa34c2e8b016458388693a7ab8f590", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa99c6a9fafac1361cd8a0fc4578fa084", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#aae6cedd7e9c8409e76787c910476813e", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#abf0efc2e493b5c0347327b7c1f175ed8", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a9d7651fe71544575150ebc08022cb885", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a78d8ac95a740d405c761c73166c9b787", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a551b96c6c0ab2bf9183de0bfcc6770a2", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1c10bb78e74942f88247cde65a03d557", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a21791e46266edb8eea13876559b352a2", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a7da38829b171a7a9147b43086e067454", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a69a3ab2775d7e6537528a3eba3c4134a", null ], + [ "TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa9182c3323cdba7f6dd30bfa56ebb8fe", null ], + [ "~TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#abbbcd9cf0c3ac0a364864f734363dd4c", null ], + [ "get_table", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#ab7a09175127849e20aa8aa5b999b4413", null ], + [ "operator=", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a4f1dd7fb1ede54aa662c808eb84cda41", null ], + [ "operator=", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#addccd32880c403ee20a6a8423d8d3f8b", null ], + [ "operator=", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a3efc5aab74f3a0594a9e88562d57867d", null ], + [ "operator[]", "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a90ac2a729fc715870e7f32ea9c6536f9", null ] +]; \ No newline at end of file diff --git a/cpp-strings/html/classpcs_1_1_slice-members.html b/cpp-strings/html/classpcs_1_1_slice-members.html new file mode 100644 index 0000000..b6e1a5f --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_slice-members.html @@ -0,0 +1,116 @@ + + + + + + + +cpp-strings: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pcs::Slice< IntT > Member List
+
+
+ +

This is the complete list of members for pcs::Slice< IntT >, including all inherited members.

+ + + + + + + + + + + + +
begin(const CppStringT< CharT > &str) noexceptpcs::Slice< IntT >inline
DEFAULT (defined in pcs::Slice< IntT >)pcs::Slice< IntT >static
end() const noexceptpcs::Slice< IntT >inline
operator*() noexceptpcs::Slice< IntT >inline
operator++() noexceptpcs::Slice< IntT >inline
operator++(int) noexceptpcs::Slice< IntT >inline
Slice(const IntT start=DEFAULT, const IntT stop=DEFAULT, const IntT step=DEFAULT) noexceptpcs::Slice< IntT >inline
start()pcs::Slice< IntT >inline
step()pcs::Slice< IntT >inline
stop()pcs::Slice< IntT >inline
~Slice() noexcept=defaultpcs::Slice< IntT >virtual
+
+
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_slice.html b/cpp-strings/html/classpcs_1_1_slice.html new file mode 100644 index 0000000..3bbc794 --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_slice.html @@ -0,0 +1,485 @@ + + + + + + + +cpp-strings: pcs::Slice< IntT > Class Template Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
pcs::Slice< IntT > Class Template Reference
+
+
+ +

Base class for slices, with start, stop and step specified values. + More...

+ +

#include <cppstrings.h>

+
+Inheritance diagram for pcs::Slice< IntT >:
+
+
+ + +pcs::StartSlice< IntT > +pcs::StartStepSlice< IntT > +pcs::StartStopSlice< IntT > +pcs::StepSlice< IntT > +pcs::StopSlice< IntT > +pcs::StopStepSlice< IntT > + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

template<typename CharT = char>
+requires std::is_same_v<CharT, char> || std::is_same_v<CharT, char16_t> || std::is_same_v<CharT, char32_t> || std::is_same_v<CharT, wchar_t>
const IntT begin (const CppStringT< CharT > &str) noexcept
 < starts iterating on specified CppString.
const bool end () const noexcept
 < returns true when iterating is over, or false otherwise.
const IntT operator* () noexcept
 < dereferences the slice.
Slice operator++ () noexcept
 < iterates one step, pre-increment. Caution: index may be out of bounds. Check '!end()' before dereferencing the slice.
Slice operator++ (int) noexcept
 < iterates one step, post-increment. Caution: index may be out of bounds. Check '!end()' before dereferencing the slice.
 Slice (const IntT start=DEFAULT, const IntT stop=DEFAULT, const IntT step=DEFAULT) noexcept
 < Valued constructor
IntT start ()
 Returns the start index of this slide.
IntT step ()
 Returns the step value of this slide.
IntT stop ()
 Returns the stop index of this slide.
virtual ~Slice () noexcept=default
 Default destructor.
+ + +

+Static Public Attributes

+static constexpr IntT DEFAULT { std::numeric_limits<IntT>::min() }
+

Detailed Description

+
template<typename IntT>
+requires std::is_signed_v<IntT>
+class pcs::Slice< IntT >

Base class for slices, with start, stop and step specified values.

+

Constructor & Destructor Documentation

+ +

◆ Slice()

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + + + + + + + + + + +
pcs::Slice< IntT >::Slice (const IntT start = DEFAULT,
const IntT stop = DEFAULT,
const IntT step = DEFAULT )
+
+inlinenoexcept
+
+ +

< Valued constructor

+ +

References start(), step(), and stop().

+ +

Referenced by operator++(), and operator++().

+ +
+
+ +

◆ ~Slice()

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + +
virtual pcs::Slice< IntT >::~Slice ()
+
+virtualdefaultnoexcept
+
+ +

Default destructor.

+ +
+
+

Member Function Documentation

+ +

◆ begin()

+ +
+
+
+template<typename IntT>
+
+template<typename CharT = char>
+requires std::is_same_v<CharT, char> || std::is_same_v<CharT, char16_t> || std::is_same_v<CharT, char32_t> || std::is_same_v<CharT, wchar_t>
+ + + + + +
+ + + + + + + +
const IntT pcs::Slice< IntT >::begin (const CppStringT< CharT > & str)
+
+inlinenoexcept
+
+ +

< starts iterating on specified CppString.

+ +
+
+ +

◆ end()

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + +
const bool pcs::Slice< IntT >::end () const
+
+inlinenodiscardnoexcept
+
+ +

< returns true when iterating is over, or false otherwise.

+ +
+
+ +

◆ operator*()

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + +
const IntT pcs::Slice< IntT >::operator* ()
+
+inlinenodiscardnoexcept
+
+ +

< dereferences the slice.

+ +
+
+ +

◆ operator++() [1/2]

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + +
Slice pcs::Slice< IntT >::operator++ ()
+
+inlinenoexcept
+
+ +

< iterates one step, pre-increment. Caution: index may be out of bounds. Check '!end()' before dereferencing the slice.

+ +

References Slice().

+ +
+
+ +

◆ operator++() [2/2]

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + +
Slice pcs::Slice< IntT >::operator++ (int )
+
+inlinenoexcept
+
+ +

< iterates one step, post-increment. Caution: index may be out of bounds. Check '!end()' before dereferencing the slice.

+ +

References Slice().

+ +
+
+ +

◆ start()

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + +
IntT pcs::Slice< IntT >::start ()
+
+inline
+
+
+ +

◆ step()

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + +
IntT pcs::Slice< IntT >::step ()
+
+inline
+
+
+ +

◆ stop()

+ +
+
+
+template<typename IntT>
+ + + + + +
+ + + + + + + +
IntT pcs::Slice< IntT >::stop ()
+
+inline
+
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/cpp-strings/html/classpcs_1_1_slice.js b/cpp-strings/html/classpcs_1_1_slice.js new file mode 100644 index 0000000..e725231 --- /dev/null +++ b/cpp-strings/html/classpcs_1_1_slice.js @@ -0,0 +1,13 @@ +var classpcs_1_1_slice = +[ + [ "Slice", "classpcs_1_1_slice.html#ab51c3b03351e495729545f2fdaebb888", null ], + [ "~Slice", "classpcs_1_1_slice.html#abdb6694913ed37cf4efc5d85e990c7b5", null ], + [ "begin", "classpcs_1_1_slice.html#ab55cf50ae2018337b942e7b9e08e3e6d", null ], + [ "end", "classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c", null ], + [ "operator*", "classpcs_1_1_slice.html#afa6b7dc85e796da20dd5933d49400996", null ], + [ "operator++", "classpcs_1_1_slice.html#a79edb1eb4e6bce136f730d82f7afeaff", null ], + [ "operator++", "classpcs_1_1_slice.html#aa3e4bcf5cfd5917cc10e0641030984c2", null ], + [ "start", "classpcs_1_1_slice.html#a5280a9d6974217c94de5d9027e10d4e1", null ], + [ "step", "classpcs_1_1_slice.html#a55f046a5343a6ea1bbff8686d2e72d78", null ], + [ "stop", "classpcs_1_1_slice.html#a0fed0ac66885187eb64d1982e0461916", null ] +]; \ No newline at end of file diff --git a/cpp-strings/html/classpcs_1_1_slice.png b/cpp-strings/html/classpcs_1_1_slice.png new file mode 100644 index 0000000000000000000000000000000000000000..85e73c3550006d62b1b8c7f6a4fd4277463779b9 GIT binary patch literal 1565 zcmbtUe^gR;6em0O!!WhdIZc_%sg*~?G)+zWfom)gf4!Q&B2St>W@?sZh>)u^&q{Z& zBBda;B++7Niwy92Wa=SBnxw92A~iLCCB_sO#M=YU&UUuHcJ}`GzI*TI^X|L%bMN_< zMT8$PH?uQCAQ0x*FECLE#7Z@6N32;1pVhSP04+^d-=JDhE(ycB2ctDFt^ol5{W&ffs?{Ssj#?Q1_nZo6_Yhh<4(|dnWN|1`TXqzfsUqV)c$jr&hkd*u-Mr zvQVJIQnPyx^pmlcWu<&bZV_X9(+owNH;S`5i90;^&dv=Ed^mZ|#MDfuHFD7Yo8t`H zS}uF)fubIR_{B!?kz&Wc#Q%57n!gwEk7+$&2<16$r9yec`ch%dX82faPgI_F+yY!o zXPZfVNVc_XFC36mU1G66#=5>?TbNXlbcx;J1LJnV$VlKuJ&X%WonSJIr>ng%Fd4?p zQ6=}bg+;@-Txj`!lPTHS59AP05-6K@ZO8x`12|9d)WGAs8`#|L7+-9CLk1PDt1|f# z+ePF9;Hc?#WGXUpz`3fPjrGO}@l+>vwX@W~Ojl#QF+gQJHoRR^i!0^&^G zM5edscvB^h6< zh}wE9Hc@vP8{T!;Mrlv19EI*>Q1f(FJouXf0GQ>+E<)>M_MOW0r%1cN3F(hLvnRI@ zcTL33F1}C>2a7o@N-CQ3e7HA=kkYR`(C8A|eVCtpl$Pue61S+$_Zw{6tY7Gtq@L*h zRuiDjRZR5~rAa(=ID~61=M+F1&pp(<5$^OrKDVDd zSq3tej(7XNytcDx2aA<;SrXi*>GbrRyqox2oM7Gdo$?QLKxNaL=uvLV!RB(*ec}(V z?mr5#($g(8Pa!_}6t_@ZHXud2PC^v}WER+JF@=KFv?({BbSJ@i7PGuw8ZA zV2AA1Ik(yet0{PDVU1zY40~0=bl(5pR#IcFCxbHC4tnRvyh>YGZ`^eppn_Mv8ba*; X-VZy-AU%aIas)Os9P?n`(Qp0$p*0@m literal 0 HcmV?d00001 diff --git a/cpp-strings/html/clipboard.js b/cpp-strings/html/clipboard.js new file mode 100644 index 0000000..9da9f3c --- /dev/null +++ b/cpp-strings/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/cpp-strings/html/cookie.js b/cpp-strings/html/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/cpp-strings/html/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/cpp-strings/html/cppstrings_8h_source.html b/cpp-strings/html/cppstrings_8h_source.html new file mode 100644 index 0000000..6f058ee --- /dev/null +++ b/cpp-strings/html/cppstrings_8h_source.html @@ -0,0 +1,2231 @@ + + + + + + + +cpp-strings: cppstrings.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
cppstrings.h
+
+
+
1#pragma once
+
22
+
23//=============================================================
+
24#include <algorithm>
+
25#include <array>
+
26#include <cassert>
+
27#include <cctype>
+
28#include <cwctype>
+
29#include <format>
+
30#include <limits>
+
31#include <map>
+
32#include <ranges>
+
33#include <span>
+
34#include <stdexcept>
+
35#include <type_traits>
+
36#include <vector>
+
37
+
38
+
39
+
40namespace pcs // i.e. "pythonic c++ strings"
+
41{
+
42 //=============================================================
+
43 // Forward declarations
+
44
+
45 // base class -- not to be directly instantiated, see belowing specializations instead
+
46 template<
+
47 class CharT,
+
48 class TraitsT = std::char_traits<CharT>,
+
49 class AllocatorT = std::allocator<CharT>
+
50 > class CppStringT;
+
51
+
52 // specializations of the base class -- these are the ones that should be instantiated by user.
+ + +
55
+
56
+
57#if defined(_MSC_VER)
+
58# pragma warning(push)
+
59# pragma warning(disable: 4455) // to avoid boring warnings with litteral operators definitions
+
60#endif
+
61
+
62 // litteral operators
+
63 inline CppString operator""_cs(const char* str, std::size_t len);
+
64 inline CppWString operator""_cs(const wchar_t* str, std::size_t len);
+
65
+
66
+
67 // slices -- to be used with operator CppStringT::operator().
+
68 template<typename IntT = std::int64_t>
+
69 requires std::is_signed_v<IntT>
+
70 class Slice;
+
71
+
72 template<typename IntT = std::int64_t>
+
73 requires std::is_signed_v<IntT>
+
74 struct StartSlice;
+
75
+
76 template<typename IntT = std::int64_t>
+
77 requires std::is_signed_v<IntT>
+
78 struct StopSlice;
+
79
+
80 template<typename IntT = std::int64_t>
+
81 requires std::is_signed_v<IntT>
+
82 struct StepSlice;
+
83
+
84 template<typename IntT = std::int64_t>
+
85 requires std::is_signed_v<IntT>
+
86 struct StartStopSlice;
+
87
+
88 template<typename IntT = std::int64_t>
+
89 requires std::is_signed_v<IntT>
+
90 struct StartStepSlice;
+
91
+
92 template<typename IntT = std::int64_t>
+
93 requires std::is_signed_v<IntT>
+
94 struct StopStepSlice;
+
95
+
96
+
97 // chars classifications -- not to be directly called, see respective specializations at the very end of this module.
+
98 template<class CharT>
+
99 inline const bool is_alpha(const CharT ch) noexcept;
+
100
+
101 template<class CharT>
+
102 inline const bool is_ascii(const CharT ch) noexcept;
+
103
+
104 template<class CharT>
+
105 inline const bool is_decimal(const CharT ch) noexcept;
+
106
+
107 template<class CharT>
+
108 inline const bool is_digit(const CharT ch) noexcept;
+
109
+
110 template<class CharT>
+
111 inline const bool is_id_continue(const CharT ch) noexcept;
+
112
+
113 template<class CharT>
+
114 inline const bool is_id_start(const CharT ch) noexcept;
+
115
+
116 template<class CharT>
+
117 inline const bool is_lower(const CharT ch) noexcept;
+
118
+
119 template<class CharT>
+
120 inline const bool is_numeric(const CharT ch) noexcept;
+
121
+
122 template<class CharT>
+
123 inline const bool is_printable(const CharT ch) noexcept;
+
124
+
125 template<class CharT>
+
126 inline const bool is_punctuation(const CharT ch) noexcept;
+
127
+
128 template<class CharT>
+
129 inline const bool is_space(const CharT ch) noexcept;
+
130
+
131 template<class CharT>
+
132 inline const bool is_upper(const CharT ch) noexcept;
+
133
+
134 template<class CharT>
+
135 inline const CharT swap_case(const CharT ch) noexcept;
+
136
+
137 template<class CharT>
+
138 inline const CharT to_lower(const CharT ch) noexcept;
+
139
+
140 template<class CharT>
+
141 inline const CharT to_upper(const CharT ch) noexcept;
+
142
+
143
+
144 //===== CppStringT<> ======================================
+
164 template<class CharT, class TraitsT, class AllocatorT>
+
165 class CppStringT : public std::basic_string<CharT, TraitsT, AllocatorT>
+
166 {
+
167 public:
+
168 //=== Wrappers ========================================
+
169 using MyBaseClass = std::basic_string<CharT, TraitsT, AllocatorT>;
+
170
+
171 using traits_type = MyBaseClass::traits_type;
+
172 using value_type = MyBaseClass::value_type;
+
173 using allocator_type = MyBaseClass::allocator_type;
+
174 using size_type = MyBaseClass::size_type;
+
175 using difference_type = MyBaseClass::difference_type;
+
176 using reference = MyBaseClass::reference;
+
177 using const_reference = MyBaseClass::const_reference;
+
178 using pointer = MyBaseClass::pointer;
+
179 using const_pointer = MyBaseClass::const_pointer;
+
180 using iterator = MyBaseClass::iterator;
+
181 using const_iterator = MyBaseClass::const_iterator;
+
182 using reverse_iterator = MyBaseClass::reverse_iterator;
+
183 using const_reverse_iterator = MyBaseClass::const_reverse_iterator;
+
184
+
185
+
186 //=== Translation Table ===============================
+ +
189 {
+
190 public:
+
191 //--- wrappers ------------------------------------
+
192 using key_type = CharT;
+
193 using value_type = CppStringT;
+
194
+
195 //--- Constructors / destructor -------------------
+
197 inline TransTable(const std::map<key_type, value_type> trans_table)
+
198 : m_table{ trans_table }
+
199 {}
+
200
+
207 TransTable(const CppStringT& keys, const CppStringT& values)
+
208 {
+
209 assert(keys.size() == values.size());
+
210 auto val_it = values.cbegin();
+
211 for (const auto k : keys)
+
212 m_table[k] = CppStringT(*val_it++);
+
213 }
+
214
+
223 TransTable(const CppStringT& keys, const CppStringT& values, const CppStringT& not_translated)
+
224 {
+
225 assert(keys.size() == values.size());
+
226 auto val_it = values.cbegin();
+
227 for (const auto k : keys)
+
228 m_table[k] = CppStringT(*val_it++);
+
229 for (const auto k : not_translated)
+
230 m_table[k] = CppStringT();
+
231 }
+
232
+
239 inline TransTable(const CppStringT& keys, const std::initializer_list<CppStringT>& values)
+
240 {
+
241 assert(keys.size() == values.size());
+
242 auto val_it = values.begin();
+
243 for (const auto k : keys)
+
244 m_table[k] = *val_it++;
+
245 }
+
246
+
255 inline TransTable(const CppStringT& keys, const std::initializer_list<CppStringT> values, const CppStringT& not_translated)
+
256 {
+
257 assert(keys.size() == values.size());
+
258 auto val_it = values.begin();
+
259 for (const auto k : keys)
+
260 m_table[k] = *val_it++;
+
261 for (const auto k : not_translated)
+
262 m_table[k] = CppStringT();
+
263 }
+
264
+
271 inline TransTable(const CharT* keys, const CharT* values)
+
272 {
+
273 while (*keys && *values)
+
274 m_table[*keys++] = value_type(*values++);
+
275 }
+
276
+
285 inline TransTable(const CharT* keys, const CharT* values, const CharT* not_translated)
+
286 {
+
287 while (*keys && *values)
+
288 m_table[*keys++] = value_type(*values++);
+
289 while (*not_translated)
+
290 m_table[*not_translated++] = CppStringT();
+
291 }
+
292
+
299 template<class KeyIt, class ValueIt>
+
300 inline TransTable(KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)
+
301 {
+
302 KeyIt key_it{ first_key };
+
303 ValueIt val_it{ first_value };
+
304 while (key_it != last_key && val_it != last_value)
+
305 m_table[*key_it++] = value_type(*val_it++);
+
306 }
+
307
+
316 template<class Key1It, class ValueIt, class Key2It>
+
317 inline TransTable(Key1It first_key, Key1It last_key,
+
318 ValueIt first_value, ValueIt last_value,
+
319 Key2It first_not_translated, Key2It last_not_translated)
+
320 {
+
321 Key1It key1_it{ first_key };
+
322 ValueIt val_it{ first_value };
+
323 while (key1_it != last_key && val_it != last_value)
+
324 m_table[*key1_it++] = value_type(*val_it++);
+
325 Key2It key2_it{ first_not_translated };
+
326 while (key2_it != last_not_translated)
+
327 m_table[*key2_it++] = CppStringT();
+
328 }
+
329
+
336 /**/
+
337 template<class StringViewLike>
+
338 explicit TransTable(const StringViewLike& keys, const StringViewLike& values)
+
339 {
+
340 assert(keys.size() == values.size());
+
341 auto val_it = values.cbegin();
+
342 for (const auto k : keys)
+
343 m_table[(*k)[0]] = value_type(*val_it++);
+
344 }
+
345
+
346 inline TransTable() noexcept = default;
+
347 inline TransTable(const TransTable&) noexcept = default;
+
348 inline TransTable(TransTable&&) noexcept = default;
+
349
+
350 inline ~TransTable() noexcept = default;
+
351
+
352 //--- operators -----------------------------------
+
353 inline TransTable& operator= (const TransTable&) noexcept = default;
+
354 inline TransTable& operator= (TransTable&&) noexcept = default;
+
355
+
357 inline TransTable& operator= (const std::map<key_type, value_type>& trans_table) noexcept
+
358 {
+
359 m_table = trans_table;
+
360 return *this;
+
361 }
+
362
+
364 [[nodiscard]]
+
365 inline value_type operator[] (const key_type ch) noexcept
+
366 {
+
367 auto it = m_table.find(ch);
+
368 if (it != m_table.end()) [[likely]] {
+
369 return it->second;
+
370 }
+
371 else [[unlikely]] {
+
372 return ch;
+
373 }
+
374 }
+
375
+
376 inline std::map<typename key_type, typename value_type>& get_table() noexcept
+
377 {
+
378 return m_table;
+
379 }
+
380
+
381 private:
+
382 std::map<typename key_type, typename value_type> m_table{}; // the internal storage of the translation table. Access it via the indexing operator.
+
383
+
384 };
+
385
+
386
+
387 //=== Constructors / Destructor =======================
+
388 inline CppStringT() : MyBaseClass() {} // #1
+
389 inline CppStringT(const CppStringT& other) : MyBaseClass(other) {} // #2
+
390 inline CppStringT(const CppStringT& other, const AllocatorT& alloc) : MyBaseClass(other, alloc) {} // #3
+
391 inline CppStringT(CppStringT&& other) noexcept : MyBaseClass(other) {} // #4
+
392 inline CppStringT(CppStringT&& other, const AllocatorT& alloc) noexcept : MyBaseClass(other, alloc) {} // #5
+
393 inline CppStringT(MyBaseClass::size_type count, CharT ch) : MyBaseClass(count, ch) {} // #6
+
394 inline CppStringT(const CppStringT& other, size_type pos) : MyBaseClass(other, pos) {} // #7
+
395 inline CppStringT(const CppStringT& other, size_type pos, size_type count) noexcept : MyBaseClass(other, pos, count) {} // #8
+
396 inline CppStringT(const CharT* s) // #9
+
397 : MyBaseClass(s ? s : CppStringT().c_str())
+
398 {}
+
399 inline CppStringT(const CharT* s, size_type count) // #10
+
400 : MyBaseClass(s ? s : CppStringT().c_str(), count)
+
401 {}
+
402 inline CppStringT(std::initializer_list<CharT> ilist) : MyBaseClass(ilist) {} // #11
+
403
+
404 inline CppStringT(const CharT ch) : MyBaseClass(1, ch) {} // #19
+
405
+
406 inline CppStringT(const MyBaseClass& other) : MyBaseClass(other) {} // #12
+
407 inline CppStringT(const MyBaseClass& other, const AllocatorT& alloc) : MyBaseClass(other, alloc) {} // #13
+
408 inline CppStringT(MyBaseClass&& other) : MyBaseClass(other) {} // #14
+
409 inline CppStringT(MyBaseClass&& other, const AllocatorT& alloc) : MyBaseClass(other, alloc) {} // #15
+
410
+
411 template<class InputIt>
+
412 inline CppStringT(InputIt first, InputIt last) : MyBaseClass(first, last) {} // #16
+
413
+
414 template<class StringViewLike>
+
415 explicit CppStringT(StringViewLike& svl) : MyBaseClass(svl) {} // #17
+
416
+
417 template<class StringViewLike>
+
418 CppStringT(StringViewLike& svl, size_type pos, size_type n) : MyBaseClass(svl, pos, n) {} // #18
+
419
+
420 inline ~CppStringT() noexcept = default;
+
421
+
422
+
423 //=== Assignment operators ============================
+
424 CppStringT& operator= (const CppStringT&) noexcept = default;
+
425 CppStringT& operator= (CppStringT&&) noexcept = default;
+
426
+
427
+
428 //=== Exceptions ======================================
+
429 class NotFoundException : public std::logic_error
+
430 {
+
431 public:
+
432 using MyBaseClass = std::logic_error;
+
433
+
434 inline NotFoundException(const std::string& what_arg) : MyBaseClass(what_arg) {}
+
435 inline NotFoundException(const char* what_arg) : MyBaseClass(what_arg) {}
+
436 };
+
437
+
438
+
439 //=== Methods =========================================
+
440
+
441 //--- capitalize() ------------------------------------
+
443 inline CppStringT capitalize() noexcept
+
444 {
+
445 CppStringT res(*this);
+
446 if (!res.empty()) [[likely]] {
+
447 res.lower();
+
448 res[0] = pcs::to_upper(res[0]);
+
449 }
+
450 return res;
+
451 }
+
452
+
453
+
454 //--- center() ----------------------------------------
+
461 [[nodiscard]]
+
462 CppStringT center(const size_type width, const value_type fillch = value_type(' ')) const noexcept
+
463 {
+
464 const size_type len{ this->size() };
+
465 if (width <= len) [[unlikely]]
+
466 return CppStringT(*this);
+
467
+
468 const size_type half{ (width - len) / 2 };
+
469 return CppStringT(half, fillch) + *this + CppStringT(width - half - len, fillch);
+
470 }
+
471
+
472
+
473 //--- contains() --------------------------------------
+
478 [[nodiscard]]
+
479 constexpr bool contains(const CppStringT& substr) const noexcept
+
480 {
+
481 if (substr.empty()) [[unlikely]]
+
482 // the empty string is always contained in any string
+
483 return true;
+
484
+
485#if (defined(_HAS_CXX23) && _HAS_CXX23) || (!defined(_HAS_CXX23) && __cplusplus >= 202302L)
+
486 // c++23 and above already defines this method
+
487 return MyBaseClass::contains(substr);
+
488#else
+
489 // up to c++20, we have to implement this method
+
490 const size_type substr_width{ substr.size() };
+
491 const size_type width{ this->size() };
+
492
+
493 if (substr_width > width) [[unlikely]]
+
494 return false;
+
495
+
496 for (size_type index = 0; index <= width - substr_width; ++index) [[likely]] {
+
497 if (substr == this->substr(index, substr_width))
+
498 return true;
+
499 }
+
500
+
501 return false;
+
502#endif
+
503 }
+
504
+
505
+
506 //--- contains_n() ------------------------------------
+
511 [[nodiscard]]
+
512 inline constexpr bool contains_n(const CppStringT& sub, const size_type start, const size_type count = -1) const noexcept
+
513 {
+
514 try {
+
515 return this->substr(start, count).contains(sub);
+
516 }
+
517 catch (...) {
+
518 return false;
+
519 }
+
520 }
+
521
+
522
+
523 //--- count() -----------------------------------------
+
525 [[nodiscard]]
+
526 constexpr size_type count(const CppStringT& sub, const size_type start = 0, const size_type end = -1) const noexcept
+
527 {
+
528 size_type n = 0;
+
529 CppStringT tmp{ this->substr(start, std::min(this->size(), end) - start + 1) };
+
530
+
531 size_type start_{ 0 };
+
532 size_type end_{ tmp.size() };
+
533
+
534 while ((start_ = tmp.find(sub, start_, end_)) != CppStringT::npos) {
+
535 start_ += sub.size();
+
536 end_ -= start_;
+
537 tmp = tmp.substr(start_, std::min(tmp.size(), end_) + 1);
+
538 start_ = 0;
+
539 n++;
+
540 }
+
541
+
542 return n;
+
543 }
+
544
+
545
+
546 //--- count_n() ---------------------------------------
+
548 [[nodiscard]]
+
549 inline constexpr size_type count_n(const CppStringT& sub, const size_type start, const size_type length) const noexcept
+
550 {
+
551 return count(sub, start, start + length - 1);
+
552 }
+
553
+
555 [[nodiscard]]
+
556 inline constexpr size_type count_n(const CppStringT& sub, const size_type length) const noexcept
+
557 {
+
558 return count(sub, 0, length - 1);
+
559 }
+
560
+
561
+
562 //--- endswith() --------------------------------------
+
564 [[nodiscard]]
+
565 inline const bool endswith(const CppStringT& suffix, const size_type start, const size_type end) const noexcept
+
566 {
+
567 return this->substr(start, end - start + 1).MyBaseClass::ends_with(suffix);
+
568 }
+
569
+
571 [[nodiscard]]
+
572 inline const bool endswith(const CppStringT& suffix, const size_type end) const noexcept
+
573 {
+
574 return this->substr(0, end).MyBaseClass::ends_with(suffix);
+
575 }
+
576
+
578 [[nodiscard]]
+
579 inline const bool endswith(const CppStringT& suffix) const noexcept
+
580 {
+
581 return static_cast<const bool>(MyBaseClass::ends_with(suffix));
+
582 }
+
583
+
585 [[nodiscard]]
+
586 const bool endswith(const std::initializer_list<CppStringT>& suffixes, const size_type start, const size_type end) const noexcept
+
587 {
+
588 if (start > end) [[unlikely]]
+
589 return false;
+
590
+
591 CppStringT tmp(this->substr(start, end - start + 1));
+
592 for (auto& suffix : suffixes) {
+
593 if (tmp.ends_with(suffix)) [[unlikely]]
+
594 return true;
+
595 }
+
596 return false;
+
597 }
+
598
+
599
+
600 //--- endswith_n() ------------------------------------
+
602 [[nodiscard]]
+
603 inline const bool endswith_n(const CppStringT& suffix, const size_type start, const size_type count) const noexcept
+
604 {
+
605 return endswith(suffix, start, start + count - 1);
+
606 }
+
607
+
609 [[nodiscard]]
+
610 inline const bool endswith_n(const CppStringT& suffix, const size_type count) const noexcept
+
611 {
+
612 return endswith(suffix, 0, count - 1);
+
613 }
+
614
+
616 [[nodiscard]]
+
617 inline const bool endswith_n(const std::initializer_list<CppStringT>& suffixes, const size_type start, const size_type count) const noexcept
+
618 {
+
619 return endswith(suffixes, start, start + count - 1);
+
620 }
+
621
+
622
+
623 //--- expand_tabs() -----------------------------------
+
625 [[nodiscard]]
+
626 CppStringT expand_tabs(const size_type tabsize = 8) const noexcept
+
627 {
+
628 const size_type tabsize_{ tabsize == 0 ? 1 : tabsize };
+
629 CppStringT ret{};
+
630
+
631 std::size_t current_pos{ 0 };
+
632 for (const value_type ch : *this) {
+
633 if (ch == value_type('\t')) [[unlikely]] {
+
634 do {
+
635 ret += value_type(' ');
+
636 current_pos++;
+
637 } while (current_pos % tabsize_ != 0);
+
638 }
+
639 else if (ch == value_type('\n') || ch == value_type('\r')) [[unlikely]] {
+
640 ret += ch;
+
641 current_pos = 0;
+
642 }
+
643 else [[likely]] {
+
644 ret += ch;
+
645 current_pos++;
+
646 }
+
647 }
+
648
+
649 return ret;
+
650 }
+
651
+
652
+
653 //--- find() ------------------------------------------
+
665 [[nodiscard]]
+
666 constexpr size_type find(const CppStringT& sub, const size_type start = 0, const size_type end = -1) const noexcept
+
667 {
+
668 const size_type end_{ (end == -1) ? this->size() : end };
+
669
+
670 if (start > end_) [[unlikely]]
+
671 return CppStringT::npos;
+
672 else [[likely]]
+
673 return find_n(sub, start, end_ - start + 1);
+
674 }
+
675
+
676
+
677 //--- find_n() ----------------------------------------
+
690 [[nodiscard]]
+
691 inline constexpr size_type find_n(const CppStringT& sub, const size_type start, const size_type count) const noexcept
+
692 {
+
693 constexpr size_type npos{ CppStringT::npos };
+
694
+
695 try {
+
696 const CppStringT sub_str{ this->substr(start, count) };
+
697 const size_type found_pos{ sub_str.MyBaseClass::find(sub) };
+
698
+
699 return (found_pos == npos) ? npos : found_pos + start;
+
700 }
+
701 catch (...) {
+
702 return npos;
+
703 }
+
704 }
+
705
+
718 [[nodiscard]]
+
719 inline constexpr size_type find_n(const CppStringT& sub, const size_type count) const noexcept
+
720 {
+
721 return find_n(sub, 0, count);
+
722 }
+
723
+
724
+
725 //--- format() ----------------------------------------
+
727 template<typename T, class... ArgsT>
+
728 inline CppStringT& format(
+
729 const std::basic_format_string<T, std::type_identity_t<ArgsT>...> frmt,
+
730 ArgsT&&... args
+
731 )
+
732 {
+
733 return *this;
+
734 }
+
735
+
736 template<class... ArgsT>
+
737 inline CppStringT& format(
+
738 const std::basic_format_string<char , std::type_identity_t<ArgsT>... > frmt,
+
739 ArgsT&&... args
+
740 )
+
741 {
+
742 return *this = std::vformat(frmt.get(), std::make_format_args(args...));
+
743 }
+
744
+
745 template<class... ArgsT>
+
746 inline CppStringT& format(
+
747 const std::basic_format_string<wchar_t, std::type_identity_t<ArgsT>... > frmt,
+
748 ArgsT&&... args
+
749 )
+
750 {
+
751 return *this = std::vformat(frmt.get(), std::make_wformat_args(args...));
+
752 }
+
753
+
754
+
755 //--- index() -----------------------------------------
+
761 [[nodiscard]]
+
762 inline constexpr size_type index(const CppStringT& sub, const size_type start = 0, const size_type end = -1) const
+
763 {
+
764 const size_type ret_value = find(sub, start, end);
+
765 if (ret_value == CppStringT::npos)
+
766 throw NotFoundException("substring not found in string.");
+
767 else
+
768 return ret_value;
+
769 }
+
770
+
771
+
772 //--- index_n() ---------------------------------------
+
778 [[nodiscard]]
+
779 inline constexpr size_type index_n(const CppStringT& sub, const size_type start, const size_type count) const
+
780 {
+
781 return index(sub, start, start + count - 1);
+
782 }
+
783
+
789 [[nodiscard]]
+
790 inline constexpr size_type index_n(const CppStringT& sub, const size_type count) const
+
791 {
+
792 return index(sub, 0, count);
+
793 }
+
794
+
795
+
796 //--- isalnum() ---------------------------------------
+
798 [[nodiscard]]
+
799 inline const bool isalnum() const noexcept
+
800 {
+
801 if (this->empty()) [[unlikely]]
+
802 return false;
+
803 else [[likely]]
+
804 return std::all_of(
+
805 this->cbegin(),
+
806 this->cend(),
+
807 [](const value_type ch) { return pcs::is_alpha(ch) || pcs::is_decimal(ch) || pcs::is_digit(ch) || pcs::is_numeric(ch); }
+
808 );
+
809 }
+
810
+
811
+
812 //--- isalpha() --------------------------------------
+
814 [[nodiscard]]
+
815 inline const bool isalpha() const noexcept
+
816 {
+
817 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_alpha<value_type>);
+
818 }
+
819
+
820
+
821 //--- isascii() ---------------------------------------
+
823#if defined(isascii) // may be already defined in header file <ctype.h>
+
824#undef isascii
+
825#endif
+
826 [[nodiscard]]
+
827 inline const bool isascii() const noexcept
+
828 {
+
829 return this->empty() || std::all_of(this->cbegin(), this->cend(), pcs::is_ascii<value_type>);
+
830 }
+
831
+
832
+
833 //--- isdecimal() -------------------------------------
+
840 [[nodiscard]]
+
841 inline const bool isdecimal() const noexcept
+
842 {
+
843 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_decimal<value_type>);
+
844 }
+
845
+
846
+
847 //--- isdigit() ---------------------------------------
+
861 [[nodiscard]]
+
862 inline const bool isdigit() const noexcept
+
863 {
+
864 return isdecimal();
+
865 }
+
866
+
867
+
868 //--- isidentifier() ----------------------------------
+
888 [[nodiscard]]
+
889 inline const bool isidentifier() const noexcept
+
890 {
+
891 return !this->empty() && pcs::is_id_start((*this)[0]) && (this->size() == 1 || std::all_of(this->cbegin() + 1, this->cend(), pcs::is_id_continue<value_type>));
+
892 }
+
893
+
894
+
895 //--- islower() ---------------------------------------
+
897 [[nodiscard]]
+
898 inline const bool islower() const noexcept
+
899 {
+
900 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_lower<value_type>);
+
901 }
+
902
+
903
+
904 //--- isnumeric() -------------------------------------
+
914 [[nodiscard]]
+
915 inline const bool isnumeric() const noexcept
+
916 {
+
917 return isdecimal();
+
918 }
+
919
+
920
+
921 //--- isprintable() -----------------------------------
+
928 [[nodiscard]]
+
929 inline const bool isprintable() const noexcept
+
930 {
+
931 return this->empty() || std::all_of(this->cbegin(), this->cend(), pcs::is_printable<value_type>);
+
932 }
+
933
+
934
+
935 //--- ispunctuation() ---------------------------------
+
937 [[nodiscard]]
+
938 inline const bool ispunctuation() const noexcept
+
939 {
+
940 return this->size() == 1 && pcs::is_punctuation((*this)[0]);
+
941 }
+
942
+
943
+
944 //--- isspace() ---------------------------------------
+
946 [[nodiscard]]
+
947 inline const bool isspace() const noexcept
+
948 {
+
949 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_space<value_type>);
+
950 }
+
951
+
952
+
953 //--- istitle() ---------------------------------------
+
963 [[nodiscard]]
+
964 inline const bool istitle() const noexcept
+
965 {
+
966 return !this->empty() && this->title() == *this;
+
967 }
+
968
+
969
+
970 //--- isupper() ---------------------------------------
+
972 [[nodiscard]]
+
973 inline const bool isupper() const noexcept
+
974 {
+
975 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_upper<value_type>);
+
976 }
+
977
+
978
+
979 //--- is_words_sep() ----------------------------------
+
981 [[nodiscard]]
+
982 inline const bool is_words_sep() const noexcept
+
983 {
+
984 return !this->empty() &&
+
985 std::all_of(
+
986 this->cbegin(),
+
987 this->cend(),
+
988 [](const value_type ch) { return pcs::is_space(ch) || pcs::is_punctuation(ch); }
+
989 );
+
990 }
+
991
+
992
+
993 //--- join() ------------------------------------------
+
998 template<const std::size_t N>
+
999 [[nodiscard]]
+
1000 CppStringT join(const std::array<CppStringT, N>& strs) const noexcept
+
1001 {
+
1002 if (strs.empty()) [[unlikely]]
+
1003 return CppStringT();
+
1004
+
1005 auto str_it = strs.cbegin();
+
1006 CppStringT res{ *str_it++ };
+
1007 while (str_it != strs.cend()) [[likely]]
+
1008 res += *this + *str_it++;
+
1009 return res;
+
1010 }
+
1011
+
1016 [[nodiscard]]
+
1017 CppStringT join(const std::vector<CppStringT>& strs) const noexcept
+
1018 {
+
1019 if (strs.empty()) [[unlikely]]
+
1020 return CppStringT();
+
1021
+
1022 auto str_it = strs.cbegin();
+
1023 CppStringT res{ *str_it++ };
+
1024 while (str_it != strs.cend()) [[likely]]
+
1025 res += *this + *str_it++;
+
1026 return res;
+
1027 }
+
1028
+
1033 template<class... NextCppStringsT>
+
1034 [[nodiscard]]
+
1035 inline CppStringT join(const CppStringT& first, const NextCppStringsT&... others) const noexcept
+
1036 requires (sizeof...(others) > 0)
+
1037 {
+
1038 return first + *this + this->join(others...);
+
1039 }
+
1040
+
1042 [[nodiscard]]
+
1043 inline CppStringT join(const CppStringT& s) const noexcept
+
1044 {
+
1045 return s;
+
1046 }
+
1047
+
1049 [[nodiscard]]
+
1050 inline const CppStringT join() const noexcept
+
1051 {
+
1052 return *this;
+
1053 }
+
1054
+
1055
+
1056 //--- ljust() -----------------------------------------
+
1062 [[nodiscard]]
+
1063 inline CppStringT ljust(const size_type width, const value_type fillch = value_type(' ')) const noexcept
+
1064 {
+
1065 if (this->size() >= width) [[unlikely]]
+
1066 return *this;
+
1067 else [[likely]]
+
1068 return CppStringT(width - this->size(), fillch) + *this;
+
1069 }
+
1070
+
1071
+
1072 //--- lower () -----------------------------------------
+
1078 inline CppStringT& lower() noexcept
+
1079 {
+
1080 std::transform(
+
1081 this->begin(),
+
1082 this->end(),
+
1083 this->begin(),
+
1084 [&](value_type ch) { return this->lower(ch); }
+
1085 );
+
1086 return *this;
+
1087 }
+
1088
+
1094 [[nodiscard]]
+
1095 static inline const value_type lower(const value_type ch) noexcept
+
1096 {
+
1097 return value_type(std::tolower(ch));
+
1098 }
+
1099
+
1100
+
1101 //--- lstrip() ----------------------------------------
+
1109 [[nodiscard]]
+
1110 inline CppStringT lstrip(const CppStringT& removedchars) const noexcept
+
1111 {
+
1112 for (auto it = this->cbegin(); it != this->cend(); ++it) [[likely]]
+
1113 if (std::none_of(removedchars.cbegin(), removedchars.cend(), [it](const value_type ch) { return *it == ch; })) [[likely]]
+
1114 return CppStringT(it, this->cend());
+
1115 return CppStringT();
+
1116 }
+
1117
+
1119 [[nodiscard]]
+
1120 inline CppStringT lstrip() const noexcept
+
1121 {
+
1122 for (auto it = this->cbegin(); it != this->cend(); ++it) [[likely]]
+
1123 if (*it != value_type(' ')) [[unlikely]]
+
1124 return CppStringT(it, this->cend());
+
1125 return CppStringT();
+
1126 }
+
1127
+
1128
+
1129 //--- operator () -------------------------------------
+
1141 template<typename IntT>
+
1142 requires std::is_signed_v<IntT>
+
1143 [[nodiscard]]
+
1144 CppStringT operator() (Slice<IntT> slice) const noexcept
+
1145 {
+
1146 // optimization on 1 by 1 step
+
1147 if (slice.step() == 1) [[likely]] {
+
1148 slice.begin(*this);
+
1149 if (slice.start() < slice.stop()) [[likely]]
+
1150 return this->substr(size_type(slice.start()), size_type(slice.stop() - slice.start() + 1));
+
1151 else [[unlikely]]
+
1152 return CppStringT();
+
1153 }
+
1154
+
1155 CppStringT res{};
+
1156
+
1157 // optimization on reversed 1 by 1 step
+
1158 if (slice.step() == -1) {
+
1159 slice.begin(*this);
+
1160 if (slice.stop() < slice.start()) [[likely]] {
+
1161 res = this->substr(size_type(slice.stop()), size_type(slice.start() - slice.stop() + 1));
+
1162 std::ranges::reverse(res); // notice: may use vectorization if available
+
1163 }
+
1164 return res;
+
1165 }
+
1166
+
1167 // finally, no trivial optimization -- and naive implementation...
+
1168 for (slice.begin(*this); !slice.end(); ++slice)
+
1169 res += (*this)[size_type(*slice)];
+
1170
+
1171 return res;
+
1172 }
+
1173
+
1175 [[nodiscard]]
+
1176 inline CppStringT operator() (const long long start, const long long stop, const long long step = 1) const noexcept
+
1177 {
+
1178 Slice<long long> slice(start, stop, step);
+
1179 return (*this)(slice);
+
1180 }
+
1181
+
1182
+
1183 //--- operator * --------------------------------------
+
1185 [[nodiscard]]
+
1186 CppStringT operator* (std::int64_t count) const noexcept
+
1187 {
+
1188 if (count <= 0) [[unlikely]]
+
1189 return CppStringT();
+
1190
+
1191 CppStringT res(*this);
+
1192 while (--count) [[likely]]
+
1193 res += *this;
+
1194 return res;
+
1195 }
+
1196
+
1197
+
1198 //--- partition() -------------------------------------
+
1204 [[nodiscard]]
+
1205 std::vector<CppStringT> partition(const CppStringT& sep) const noexcept
+
1206 {
+
1207 const size_type sep_index = find(sep);
+
1208 if (sep_index == CppStringT::npos) {
+
1209 const CppStringT empty{};
+
1210 return std::vector<CppStringT>({ *this, empty, empty });
+
1211 }
+
1212 else {
+
1213 const size_type third_index = sep_index + sep.size();
+
1214 const size_type third_size = this->size() - third_index + 1;
+
1215 return std::vector<CppStringT>({ this->substr(0, sep_index), sep, this->substr(third_index, third_size) });
+
1216 }
+
1217 }
+
1218
+
1219
+
1220 //--- removeprefix() ----------------------------------
+
1222 [[nodiscard]]
+
1223 inline CppStringT removeprefix(const CppStringT& prefix) const noexcept
+
1224 {
+
1225 if (this->startswith(prefix)) {
+
1226 const size_type prefix_length = prefix.size();
+
1227 return this->substr(prefix_length, this->size() - prefix_length + 1);
+
1228 }
+
1229 else
+
1230 return *this;
+
1231 }
+
1232
+
1233
+
1234 //--- removesuffix() ----------------------------------
+
1236 [[nodiscard]]
+
1237 inline CppStringT removesuffix(const CppStringT& suffix) const noexcept
+
1238 {
+
1239 if (this->endswith(suffix)) {
+
1240 const size_type suffix_length = suffix.size();
+
1241 return this->substr(0, this->size() - suffix_length);
+
1242 }
+
1243 else
+
1244 return *this;
+
1245 }
+
1246
+
1247
+
1248 //--- replace() ---------------------------------------
+
1250 [[nodiscard]]
+
1251 CppStringT replace(const CppStringT& old, const CppStringT& new_, size_type count = -1) const noexcept
+
1252 {
+
1253 if (old == new_ || old.empty()) [[unlikely]]
+
1254 return *this;
+
1255
+
1256 CppStringT res{};
+
1257 size_type prev_index = 0;
+
1258 size_type current_index = 0;
+
1259 while (count > 0 && (current_index = this->find(old, prev_index)) != CppStringT::npos) {
+
1260 res += this->substr(prev_index, current_index - prev_index) + new_;
+
1261 prev_index = current_index + 1;
+
1262 --count;
+
1263 }
+
1264
+
1265 if (prev_index < this->size()) [[likely]]
+
1266 res += this->substr(prev_index, this->size() - prev_index);
+
1267
+
1268 return res;
+
1269 }
+
1270
+
1271
+
1272 //--- rfind() -----------------------------------------
+
1287 [[nodiscard]]
+
1288 inline constexpr size_type rfind(const CppStringT& sub, const size_type start, const size_type end) const noexcept
+
1289 {
+
1290 if (start > end) [[unlikely]]
+
1291 return CppStringT::npos;
+
1292 else if (sub.empty()) [[unlikely]]
+
1293 return 0;
+
1294 else [[likely]] {
+
1295 const size_type found_pos{ this->substr(start, end - start + 1).rfind(sub) };
+
1296 return (found_pos == CppStringT::npos) ? CppStringT::npos : found_pos + start;
+
1297 }
+
1298 }
+
1299
+
1300
+
1315 [[nodiscard]]
+
1316 inline constexpr size_type rfind(const CppStringT& sub, const size_type start) const noexcept
+
1317 {
+
1318 return rfind(sub, start, this->size() - 1);
+
1319 }
+
1320
+
1321
+
1336 [[nodiscard]]
+
1337 inline constexpr size_type rfind(const CppStringT& sub) const noexcept
+
1338 {
+
1339 return MyBaseClass::rfind(sub);
+
1340 }
+
1341
+
1342
+
1343 //--- rfind_n() ---------------------------------------
+
1352 [[nodiscard]]
+
1353 inline constexpr size_type rfind_n(const CppStringT& sub, const size_type start, const size_type count) const noexcept
+
1354 {
+
1355 return rfind(sub, start, start + count - 1);
+
1356 }
+
1357
+
1366 [[nodiscard]]
+
1367 inline constexpr size_type rfind_n(const CppStringT& sub, const size_type count) const noexcept
+
1368 {
+
1369 if (count == 0) [[unlikely]]
+
1370 return CppStringT::npos;
+
1371 else [[likely]]
+
1372 return rfind(sub, 0, count - 1);
+
1373 }
+
1374
+
1375
+
1376 //--- rindex() ----------------------------------------
+
1382 [[nodiscard]]
+
1383 inline constexpr size_type rindex(const CppStringT& sub, const size_type start, const size_type end) const
+
1384 {
+
1385 const size_type ret_value = rfind(sub, start, end);
+
1386 if (ret_value == CppStringT::npos)
+
1387 throw NotFoundException("substring not found in string");
+
1388 else
+
1389 return ret_value;
+
1390 }
+
1391
+
1397 [[nodiscard]]
+
1398 inline constexpr size_type rindex(const CppStringT& sub, const size_type start) const
+
1399 {
+
1400 return rindex(sub, start, this->size() - 1);
+
1401 }
+
1402
+
1408 [[nodiscard]]
+
1409 inline constexpr size_type rindex(const CppStringT& sub) const
+
1410 {
+
1411 return rindex(sub, 0, this->size() - 1);
+
1412 }
+
1413
+
1414
+
1415 //--- rindex_n() --------------------------------------
+
1421 [[nodiscard]]
+
1422 inline constexpr size_type rindex_n(const CppStringT& sub, const size_type start, const size_type count) const
+
1423 {
+
1424 return rindex(sub, start, start + count - 1);
+
1425 }
+
1426
+
1432 [[nodiscard]]
+
1433 inline constexpr size_type rindex_n(const CppStringT& sub, const size_type count) const
+
1434 {
+
1435 return rindex(sub, 0, count);
+
1436 }
+
1437
+
1438
+
1439 //--- rjust() -----------------------------------------
+
1445 [[nodiscard]]
+
1446 inline CppStringT rjust(const size_type width, const value_type fillch = value_type(' ')) const noexcept
+
1447 {
+
1448 if (this->size() >= width) [[unlikely]]
+
1449 return *this;
+
1450 else [[likely]]
+
1451 return *this + CppStringT(width - this->size(), fillch);
+
1452 }
+
1453
+
1454
+
1455 //--- rpartition() -------------------------------------
+
1461 [[nodiscard]]
+
1462 std::vector<CppStringT> rpartition(const CppStringT& sep) const noexcept
+
1463 {
+
1464 const size_type sep_index = rfind(sep);
+
1465 if (sep_index == CppStringT::npos) {
+
1466 const CppStringT empty{};
+
1467 return std::vector<CppStringT>({ *this, empty, empty });
+
1468 }
+
1469 else {
+
1470 const size_type third_index = sep_index + sep.size();
+
1471 const size_type third_size = this->size() - third_index + 1;
+
1472 return std::vector<CppStringT>({ this->substr(0, sep_index), sep, this->substr(third_index, third_size) });
+
1473 }
+
1474 }
+
1475
+
1476
+
1477 //--- rsplit() ----------------------------------------
+
1483 [[nodiscard]]
+
1484 inline std::vector<CppStringT> rsplit() noexcept
+
1485 {
+
1486 return split();
+
1487 }
+
1488
+
1490 [[nodiscard]]
+
1491 inline std::vector<CppStringT> rsplit(const CppStringT& sep) noexcept
+
1492 {
+
1493 return split(sep);
+
1494 }
+
1495
+
1497 [[nodiscard]]
+
1498 inline std::vector<CppStringT> rsplit(const size_type maxsplit) noexcept
+
1499 {
+
1500 return rsplit(CppStringT(value_type(' ')), maxsplit);
+
1501 }
+
1502
+
1504 [[nodiscard]]
+
1505 std::vector<CppStringT> rsplit(const CppStringT& sep, const size_type maxsplit) noexcept
+
1506 {
+
1507 std::vector<CppStringT> res{};
+
1508
+
1509 if (maxsplit == 0) [[unlikely]] {
+
1510 res.push_back({ *this });
+
1511 }
+
1512 else [[likely]] {
+
1513 const size_type sep_size{ sep.size() };
+
1514 std::vector<size_type> indexes{};
+
1515 CppStringT tmp{ *this };
+
1516 size_type count{ maxsplit };
+
1517 size_type index{ 0 };
+
1518
+
1519 while ((index = tmp.rfind(sep)) != CppStringT::npos && count > 0) {
+
1520 indexes.insert(indexes.begin(), index);
+
1521 if (index == 0)
+
1522 break;
+
1523 tmp = tmp.substr(0, index);
+
1524 count--;
+
1525 }
+
1526
+
1527 if (indexes.size() == 0)
+
1528 res.push_back(*this);
+
1529 else {
+
1530 index = 0;
+
1531 for (const size_type ndx : indexes) {
+
1532 res.push_back(this->substr(index, ndx - index));
+
1533 index = ndx + sep_size;
+
1534 }
+
1535 }
+
1536 res.push_back(this->substr(index, this->size() - index));
+
1537 }
+
1538
+
1539 return res;
+
1540 }
+
1541
+
1542
+
1543 //--- rstrip() ----------------------------------------
+
1551 [[nodiscard]]
+
1552 inline CppStringT rstrip(const CppStringT& removedchars) const noexcept
+
1553 {
+
1554 for (auto it = this->crbegin(); it != this->crend(); ++it)
+
1555 if (std::none_of(removedchars.cbegin(), removedchars.cend(), [it](const value_type ch) { return *it == ch; }))
+
1556 return CppStringT(this->cbegin(), this->cbegin() + this->size() - (it - this->crbegin()));
+
1557 return CppStringT();
+
1558 }
+
1559
+
1561 [[nodiscard]]
+
1562 inline CppStringT rstrip() const noexcept
+
1563 {
+
1564 for (auto it = this->crbegin(); it != this->crend(); ++it)
+
1565 if (*it != value_type(' '))
+
1566 return CppStringT(this->cbegin(), this->cbegin() + this->size() - (it - this->crbegin()));
+
1567 return CppStringT();
+
1568 }
+
1569
+
1570
+
1571 //--- split() -----------------------------------------
+
1577 [[nodiscard]]
+
1578 inline std::vector<CppStringT> split() noexcept
+
1579 {
+
1580 std::vector<CppStringT> res;
+
1581 const CppStringT whitespace(value_type(' '));
+
1582 for (const auto& word : *this | std::views::split(whitespace))
+
1583 res.push_back(CppStringT(word.begin(), word.end()));
+
1584 return res;
+
1585 }
+
1586
+
1596 [[nodiscard]]
+
1597 inline std::vector<CppStringT> split(const CppStringT& sep) noexcept
+
1598 {
+
1599 std::vector<CppStringT> res;
+
1600 for (const auto& word : *this | std::views::split(sep))
+
1601 res.push_back(CppStringT(word.begin(), word.end()));
+
1602 return res;
+
1603 }
+
1604
+
1606 [[nodiscard]]
+
1607 inline std::vector<CppStringT> split(const size_type maxsplit) noexcept
+
1608 {
+
1609 return split(CppStringT(value_type(' ')), maxsplit);
+
1610 }
+
1611
+
1613 [[nodiscard]]
+
1614 std::vector<CppStringT> split(const CppStringT& sep, const size_type maxsplit) noexcept
+
1615 {
+
1616 std::vector<CppStringT> res{};
+
1617
+
1618 if (maxsplit == 0) [[unlikely]] {
+
1619 res.push_back(*this);
+
1620 }
+
1621 else [[likely]] {
+
1622 const size_type sep_size{ sep.size() };
+
1623 std::vector<size_type> indexes{};
+
1624 size_type count{ maxsplit };
+
1625 size_type index{ 0 };
+
1626
+
1627 while ((index = this->find(sep, index)) != CppStringT::npos && count > 0) {
+
1628 indexes.push_back(index);
+
1629 if (index == this->size())
+
1630 break;
+
1631 index += sep_size;
+
1632 count--;
+
1633 }
+
1634
+
1635 if (indexes.size() == 0)
+
1636 res.push_back(*this);
+
1637 else {
+
1638 index = 0;
+
1639 for (const size_type ndx : indexes) {
+
1640 res.push_back(this->substr(index, ndx - index));
+
1641 index = ndx + sep_size;
+
1642 }
+
1643 }
+
1644 res.push_back(this->substr(index, this->size() - index));
+
1645 }
+
1646
+
1647 return res;
+
1648 }
+
1649
+
1650
+
1651 //--- splitlines() ------------------------------------
+
1670 [[nodiscard]]
+
1671 std::vector<CppStringT> splitlines(const bool keep_end = false) const noexcept
+
1672 {
+
1673 std::vector<CppStringT> res{};
+
1674 CppStringT current{};
+
1675 bool prev_cr = false;
+
1676
+
1677 for (const value_type ch : *this) {
+
1678 switch (ch) {
+
1679 case 0x0b: [[unlikely]] // Line Tabulation, \v as well as \x0b and \013
+
1680 case 0x0c: [[unlikely]] // Form Feed, \f as well as \x0c and \014
+
1681 case 0x1c: [[unlikely]] // File Separator, or \034
+
1682 case 0x1d: [[unlikely]] // Group Separator, or \035
+
1683 case 0x1e: [[unlikely]] // Record Separator, or \036
+
1684 //case L'\u0085': [[unlikely]] // Next Line (C1 Control Code), or \0205
+
1685 //case L'\u2028': [[unlikely]] // Line Separator
+
1686 //case L'\u2029': [[unlikely]] // Paragraph Separator
+
1687 if (prev_cr) [[unlikely]] {
+
1688 res.push_back(current);
+
1689 current.clear();
+
1690 }
+
1691 if (keep_end) [[unlikely]]
+
1692 current += ch;
+
1693 res.push_back(current);
+
1694 current.clear();
+
1695 prev_cr = false;
+
1696 break;
+
1697
+
1698 case value_type('\r'): [[unlikely]] // Line Feed
+
1699 if (prev_cr) [[unlikely]] {
+
1700 res.push_back(current);
+
1701 current.clear();
+
1702 }
+
1703 if (keep_end) [[unlikely]]
+
1704 current += ch;
+
1705 prev_cr = true;
+
1706 break;
+
1707
+
1708 case value_type('\n'): [[unlikely]] // Carriage return
+
1709 if (keep_end) [[unlikely]]
+
1710 current += ch;
+
1711 res.push_back(current);
+
1712 current.clear();
+
1713 prev_cr = false;
+
1714 break;
+
1715
+
1716
+
1717 default: [[likely]]
+
1718 if (prev_cr) [[unlikely]] {
+
1719 res.push_back(current);
+
1720 current.clear();
+
1721 prev_cr = false;
+
1722 }
+
1723 current += ch;
+
1724 break;
+
1725 }
+
1726 }
+
1727
+
1728 if (prev_cr) [[unlikely]] {
+
1729 res.push_back(current);
+
1730 }
+
1731
+
1732 return res;
+
1733 }
+
1734
+
1735
+
1736 //--- startswith() ------------------------------------
+
1738 [[nodiscard]]
+
1739 inline const bool startswith(const CppStringT& prefix, const size_type start, const size_type end) const noexcept
+
1740 {
+
1741 return this->substr(start, end - start + 1).MyBaseClass::starts_with(prefix);
+
1742 }
+
1743
+
1745 [[nodiscard]]
+
1746 inline const bool startswith(const CppStringT& prefix, const size_type start) const noexcept
+
1747 {
+
1748 return startswith(prefix, start, this->size() - 1);
+
1749 }
+
1750
+
1752 [[nodiscard]]
+
1753 inline const bool startswith(const CppStringT& prefix) const noexcept
+
1754 {
+
1755 return this->starts_with(prefix);
+
1756 }
+
1757
+
1759 [[nodiscard]]
+
1760 inline const bool startswith(const std::initializer_list<CppStringT>& prefixes, const size_type start, const size_type end) const noexcept
+
1761 {
+
1762 if (start > end)
+
1763 return false;
+
1764
+
1765 CppStringT tmp(this->substr(start, end));
+
1766 for (auto& prefix : prefixes) {
+
1767 if (tmp.starts_with(prefix))
+
1768 return true;
+
1769 }
+
1770 return false;
+
1771 }
+
1772
+
1773
+
1774 //--- startswith_n() ----------------------------------
+
1776 [[nodiscard]]
+
1777 inline const bool startswith_n(const CppStringT& prefix, const size_type start, const size_type count) const noexcept
+
1778 {
+
1779 return this->substr(start, count).MyBaseClass::starts_with(prefix);
+
1780 }
+
1781
+
1783 [[nodiscard]]
+
1784 inline const bool startswith_n(const CppStringT& prefix, const size_type count) const noexcept
+
1785 {
+
1786 return this->substr(0, count).MyBaseClass::starts_with(prefix);
+
1787 }
+
1788
+
1790 [[nodiscard]]
+
1791 inline const bool startswith_n(const std::initializer_list<CppStringT>& prefix, const size_type start, const size_type count) const noexcept
+
1792 {
+
1793 return startswith(prefix, start, count);
+
1794 }
+
1795
+
1796
+
1797 //--- strip() -----------------------------------------
+
1804 [[nodiscard]]
+
1805 inline CppStringT strip(const CppStringT& removedchars) const noexcept
+
1806 {
+
1807 return this->rstrip(removedchars).lstrip(removedchars);
+
1808 }
+
1809
+
1811 [[nodiscard]]
+
1812 inline CppStringT strip() const noexcept
+
1813 {
+
1814 return this->rstrip().lstrip();
+
1815 }
+
1816
+
1817
+
1818 //--- substr() ----------------------------------------
+
1820 [[nodiscard]]
+
1821 inline CppStringT substr(const size_type start, const size_type count = -1) const noexcept
+
1822 {
+
1823 if (start > this->size()) [[unlikely]]
+
1824 return CppStringT();
+
1825
+
1826 const size_type width{ std::min(count, this->size() - start + 1) };
+
1827 return CppStringT(MyBaseClass::substr(start, width));
+
1828 }
+
1829
+
1830
+
1831 //--- swapcase() --------------------------------------
+
1836 [[nodiscard]]
+
1837 inline CppStringT swapcase() const noexcept
+
1838 {
+
1839 CppStringT res;
+
1840 std::ranges::transform(*this, std::back_inserter(res), [](const value_type c) -> value_type { return pcs::swap_case(c); });
+
1841 return res;
+
1842 }
+
1843
+
1844
+
1845 //--- title() -----------------------------------------
+
1847 [[nodiscard]]
+
1848 CppStringT title() const noexcept
+
1849 {
+
1850 const CppStringT whitespace(value_type(' '));
+
1851
+
1852 CppStringT res(*this);
+
1853 std::vector<CppStringT> words = res.split(whitespace);
+
1854
+
1855 for (CppStringT& word : words)
+
1856 word = word.capitalize();
+
1857
+
1858 return whitespace.join(words);
+
1859 }
+
1860
+
1861
+
1862 //--- translate() -------------------------------------
+
1869 [[nodiscard]]
+
1870 CppStringT translate(TransTable& table) noexcept
+
1871 {
+
1872 CppStringT res{};
+
1873 for (auto ch : *this) {
+
1874 try { res += table[ch]; }
+
1875 catch (...) { res += ch; }
+
1876 }
+
1877 return res;
+
1878 }
+
1879
+
1880
+
1881 //--- upper () -----------------------------------------
+
1887 inline CppStringT& upper() noexcept
+
1888 {
+
1889 CppStringT res{};
+
1890 std::ranges::transform(*this, std::back_inserter(res), [&](const value_type ch) -> value_type { return this->upper(ch); });
+
1891 return *this = res;
+
1892 }
+
1893
+
1899 [[nodiscard]]
+
1900 static inline const value_type upper(const value_type ch) noexcept
+
1901 {
+
1902 return value_type(std::toupper(ch));
+
1903 }
+
1904
+
1905
+
1906 //--- zfill() -----------------------------------------
+
1913 [[nodiscard]]
+
1914 inline CppStringT zfill(const size_type width) const noexcept
+
1915 {
+
1916 if (this->size() >= width) [[unlikely]]
+
1917 return *this;
+
1918
+
1919 const size_type padding_width = width - this->size();
+
1920 if ((*this)[0] == '-' || (*this)[0] == '+') [[unlikely]]
+
1921 return (*this)[0] + this->substr(1, this->size() - 1).ljust(width - 1, value_type('0'));
+
1922 else [[likely]]
+
1923 return this->ljust(width, value_type('0'));
+
1924 }
+
1925
+
1926 };
+
1927
+
1928
+
1929 //===== litteral operators ============================
+
1931 inline CppString operator""_cs(const char* str, std::size_t len)
+
1932 {
+
1933 return CppString(CppString::MyBaseClass(str, len));
+
1934 }
+
1935
+
1937 inline CppWString operator""_cs(const wchar_t* str, std::size_t len)
+
1938 {
+
1939 return CppWString(CppWString::MyBaseClass(str, len));
+
1940 }
+
1941
+
1942
+
1943 //===== Slices ========================================
+
1944 //--- slices base -------------------------------------
+
1946 template<typename IntT>
+
1947 requires std::is_signed_v<IntT>
+
1948 class Slice
+
1949 {
+
1950 public:
+
1951 static constexpr IntT DEFAULT{ std::numeric_limits<IntT>::min() };
+
1952
+
1953 //--- Constructors / Destructor -------------------
+
1954 Slice(const IntT start = DEFAULT, const IntT stop = DEFAULT, const IntT step = DEFAULT) noexcept
+
1955 : _start(start)
+
1956 , _stop(stop)
+
1957 , _step(step)
+
1958 {}
+
1959
+
1960 virtual ~Slice() noexcept = default;
+
1961
+
1962
+
1963 //--- iterating -----------------------------------
+
1964 template<typename CharT = char>
+
1965#if (defined(_HAS_CXX20) && _HAS_CXX20)
+
1966 requires std::is_same_v<CharT, char> || std::is_same_v<CharT, char8_t> || std::is_same_v<CharT, char16_t> || std::is_same_v<CharT, char32_t> || std::is_same_v<CharT, wchar_t>
+
1967#else
+
1968 requires std::is_same_v<CharT, char> || std::is_same_v<CharT, char16_t> || std::is_same_v<CharT, char32_t> || std::is_same_v<CharT, wchar_t>
+
1969#endif
+
1970 inline const IntT begin(const CppStringT<CharT>& str) noexcept
+
1971 {
+
1972 return _prepare_iterating(IntT(str.size()));
+
1973 }
+
1974
+
1975 [[nodiscard]]
+
1976 inline const bool end() const noexcept
+
1977 {
+
1978 return _step == 0 ? true : _step > 0 ? _index >= _stop : _index <= _stop;
+
1979 }
+
1980
+
1981 inline Slice operator++() noexcept
+
1982 {
+
1983 _index += _step;
+
1984 return *this;
+
1985 }
+
1986
+
1987 inline Slice operator++(int) noexcept
+
1988 {
+
1989 _index += _step;
+
1990 return *this;
+
1991 }
+
1992
+
1993 [[nodiscard]]
+
1994 inline const IntT operator*() noexcept
+
1995 {
+
1996 return _index;
+
1997 }
+
1998
+
1999 //--- properties ----------------------------------
+
2000 inline IntT start() { return _start; }
+
2001 inline IntT stop() { return _stop; }
+
2002 inline IntT step() { return _step; }
+
2003
+
2004
+
2005 private:
+
2006 IntT _start{ 0 };
+
2007 IntT _stop{ DEFAULT };
+
2008 IntT _step{ 1 };
+
2009
+
2010 IntT _index{ 0 };
+
2011
+
2012 [[nodiscard]]
+
2013 const IntT _prepare_iterating(const IntT str_size) noexcept
+
2014 {
+
2015 if (_start == DEFAULT) {
+
2016 if (_step < 0 && _step != DEFAULT) [[unlikely]]
+
2017 _start = str_size - 1;
+
2018 else [[likely]]
+
2019 _start = 0;
+
2020 }
+
2021 else if (_start < 0) {
+
2022 _start += str_size;
+
2023 if (_start < 0) [[unlikely]]
+
2024 _start = 0;
+
2025 }
+
2026 else if (_start >= str_size) {
+
2027 if (_step < 0 && _step != DEFAULT)
+
2028 _start = str_size - 1;
+
2029 }
+
2030
+
2031 if (_stop == DEFAULT) {
+
2032 if (_step < 0 && _step != DEFAULT) [[unlikely]]
+
2033 _stop = 0;
+
2034 else
+
2035 _stop = str_size;
+
2036 }
+
2037 else if (_stop < 0) {
+
2038 _stop += str_size;
+
2039 if (_stop < 0)
+
2040 _stop = 0;
+
2041 }
+
2042 else if (_stop > str_size)
+
2043 _stop = str_size;
+
2044
+
2045 if (_step == DEFAULT) [[likely]]
+
2046 _step = 1;
+
2047 if (_step < 0) [[unlikely]] {
+
2048 if (_start <= _stop)
+
2049 _step = 0; // will force end() to true
+
2050 }
+
2051 else [[unlikely]] {
+
2052 if (_start >= _stop)
+
2053 _step = 0; // will force end() to true
+
2054 }
+
2055
+
2056 return _index = _start;
+
2057 }
+
2058 };
+
2059
+
2060
+
2062 template<typename IntT>
+
2063 requires std::is_signed_v<IntT>
+
2064 struct StartSlice : public Slice<IntT>
+
2065 {
+
2066 using MyBaseClass = Slice<IntT>;
+
2067
+
2068 //--- Constructors / Destructor -------------------
+
2069 inline StartSlice(const IntT start = MyBaseClass::DEFAULT) noexcept
+
2070 : MyBaseClass(start, MyBaseClass::DEFAULT, 1)
+
2071 {}
+
2072
+
2073 virtual ~StartSlice() noexcept = default;
+
2074 };
+
2075
+
2076
+
2078 template<typename IntT>
+
2079 requires std::is_signed_v<IntT>
+
2080 struct StopSlice : public Slice<IntT>
+
2081 {
+
2082 using MyBaseClass = Slice<IntT>;
+
2083
+
2084 //--- Constructors / Destructor -------------------
+
2085 inline StopSlice(const IntT stop = MyBaseClass::DEFAULT) noexcept
+
2086 : MyBaseClass(MyBaseClass::DEFAULT, stop, 1)
+
2087 {}
+
2088
+
2089 virtual ~StopSlice() noexcept = default;
+
2090 };
+
2091
+
2092
+
2094 template<typename IntT>
+
2095 requires std::is_signed_v<IntT>
+
2096 struct StepSlice : public Slice<IntT>
+
2097 {
+
2098 using MyBaseClass = Slice<IntT>;
+
2099
+
2100 //--- Constructors / Destructor -------------------
+
2101 inline StepSlice(const IntT step = MyBaseClass::DEFAULT) noexcept
+
2102 : MyBaseClass(MyBaseClass::DEFAULT, MyBaseClass::DEFAULT, step)
+
2103 {}
+
2104
+
2105 virtual ~StepSlice() noexcept = default;
+
2106 };
+
2107
+
2108
+
2110 template<typename IntT>
+
2111 requires std::is_signed_v<IntT>
+
2112 struct StartStopSlice : public Slice<IntT>
+
2113 {
+
2114 using MyBaseClass = Slice<IntT>;
+
2115
+
2116 //--- Constructors / Destructor -------------------
+
2117 inline StartStopSlice(const IntT start = MyBaseClass::DEFAULT, const IntT stop = MyBaseClass::DEFAULT) noexcept
+
2118 : MyBaseClass(start, stop, 1)
+
2119 {}
+
2120
+
2121 virtual ~StartStopSlice() noexcept = default;
+
2122 };
+
2123
+
2124
+
2126 template<typename IntT>
+
2127 requires std::is_signed_v<IntT>
+
2128 struct StartStepSlice : public Slice<IntT>
+
2129 {
+
2130 using MyBaseClass = Slice<IntT>;
+
2131
+
2132 //--- Constructors / Destructor -------------------
+
2133 inline StartStepSlice(const IntT start = MyBaseClass::DEFAULT, const IntT step = MyBaseClass::DEFAULT) noexcept
+
2134 : MyBaseClass(start, MyBaseClass::DEFAULT, step)
+
2135 {}
+
2136
+
2137 virtual ~StartStepSlice() noexcept = default;
+
2138
+
2139 };
+
2140
+
2141
+
2143 template<typename IntT>
+
2144 requires std::is_signed_v<IntT>
+
2145 struct StopStepSlice : public Slice<IntT>
+
2146 {
+
2147 using MyBaseClass = Slice<IntT>;
+
2148
+
2149 //--- Constructors / Destructor -------------------
+
2150 inline StopStepSlice(const IntT stop = MyBaseClass::DEFAULT, const IntT step = MyBaseClass::DEFAULT) noexcept
+
2151 : MyBaseClass(MyBaseClass::DEFAULT, stop, step)
+
2152 {}
+
2153
+
2154 virtual ~StopStepSlice() noexcept = default;
+
2155 };
+
2156
+
2157
+
2158 //===== templated chars classes ===========================
+
2159 //--- is_alpha() ------------------------------------------
+
2161 template<class CharT>
+
2162 [[nodiscard]]
+
2163 inline const bool is_alpha(const CharT ch) noexcept
+
2164 {
+
2165 return false;
+
2166 }
+
2167
+
2169 template<>
+
2170 [[nodiscard]]
+
2171 inline const bool is_alpha<char>(const char ch) noexcept
+
2172 {
+
2173 return static_cast<const bool>(std::isalpha(static_cast<unsigned char>(ch)));
+
2174 }
+
2175
+
2177 template<>
+
2178 [[nodiscard]]
+
2179 inline const bool is_alpha<wchar_t>(const wchar_t ch) noexcept
+
2180 {
+
2181 return static_cast<const bool>(std::iswalpha(ch));
+
2182 }
+
2183
+
2184
+
2185 //--- is_ascii() ------------------------------------------
+
2187 template<class CharT>
+
2188 [[nodiscard]]
+
2189 inline const bool is_ascii(const CharT ch) noexcept
+
2190 {
+
2191 return CharT(0x00) <= ch && ch <= CharT(0x7f);
+
2192 }
+
2193
+
2194
+
2195 //--- is_decimal() ----------------------------------------
+
2197 template<class CharT>
+
2198 [[nodiscard]]
+
2199 inline const bool is_decimal(const CharT ch) noexcept
+
2200 {
+
2201 return false;
+
2202 }
+
2203
+
2205 template<>
+
2206 [[nodiscard]]
+
2207 inline const bool is_decimal<char>(const char ch) noexcept
+
2208 {
+
2209 return static_cast<const bool>(std::isdigit(static_cast<unsigned char>(ch)));
+
2210 }
+
2211
+
2213 template<>
+
2214 [[nodiscard]]
+
2215 inline const bool is_decimal<wchar_t>(const wchar_t ch) noexcept
+
2216 {
+
2217 return (const bool)std::iswdigit(ch);
+
2218 }
+
2219
+
2220
+
2221 //--- is_digit() ------------------------------------------
+
2223 template<class CharT>
+
2224 [[nodiscard]]
+
2225 inline const bool is_digit(const CharT ch) noexcept
+
2226 {
+
2227 return pcs::is_decimal(ch);
+
2228 }
+
2229
+
2231 template<>
+
2232 [[nodiscard]]
+
2233 inline const bool is_digit<char>(const char ch) noexcept
+
2234 {
+
2235 return pcs::is_decimal(ch);
+
2236 }
+
2237
+
2239 template<>
+
2240 [[nodiscard]]
+
2241 inline const bool is_digit<wchar_t>(const wchar_t ch) noexcept
+
2242 {
+
2243 return pcs::is_decimal(ch);
+
2244 }
+
2245
+
2246
+
2247 //--- is_id_continue() ------------------------------------
+
2249 template<class CharT>
+
2250 [[nodiscard]]
+
2251 inline const bool is_id_continue(const CharT ch) noexcept
+
2252 {
+
2253 return pcs::is_id_start(ch) || pcs::is_decimal(ch);
+
2254 }
+
2255
+
2256
+
2257 //--- is_id_start() ---------------------------------------
+
2259 template<class CharT>
+
2260 [[nodiscard]]
+
2261 inline const bool is_id_start(const CharT ch) noexcept
+
2262 {
+
2263 return pcs::is_alpha(ch) || ch == CharT('_');
+
2264 }
+
2265
+
2266
+
2267 //--- is_lower() ------------------------------------------
+
2269 template<class CharT>
+
2270 [[nodiscard]]
+
2271 inline const bool is_lower(const CharT ch) noexcept
+
2272 {
+
2273 return false;
+
2274 }
+
2275
+
2277 template<>
+
2278 [[nodiscard]]
+
2279 inline const bool is_lower<char>(const char ch) noexcept
+
2280 {
+
2281 return std::islower(static_cast<unsigned char>(ch));
+
2282 }
+
2283
+
2285 template<>
+
2286 [[nodiscard]]
+
2287 inline const bool is_lower<wchar_t>(const wchar_t ch) noexcept
+
2288 {
+
2289 return std::iswlower(ch);
+
2290 }
+
2291
+
2292
+
2293 //--- is_numeric() ----------------------------------------
+
2295 template<class CharT>
+
2296 [[nodiscard]]
+
2297 inline const bool is_numeric(const CharT ch) noexcept
+
2298 {
+
2299 return pcs::is_decimal(ch);
+
2300 }
+
2301
+
2303 template<>
+
2304 [[nodiscard]]
+
2305 inline const bool is_numeric<char>(const char ch) noexcept
+
2306 {
+
2307 return pcs::is_decimal(ch);
+
2308 }
+
2309
+
2311 template<>
+
2312 [[nodiscard]]
+
2313 inline const bool is_numeric<wchar_t>(const wchar_t ch) noexcept
+
2314 {
+
2315 return pcs::is_decimal(ch);
+
2316 }
+
2317
+
2318
+
2319 //--- is_printable() --------------------------------------
+
2321 template<class CharT>
+
2322 [[nodiscard]]
+
2323 inline const bool is_printable(const CharT ch) noexcept
+
2324 {
+
2325 return false;
+
2326 }
+
2327
+
2329 template<>
+
2330 [[nodiscard]]
+
2331 inline const bool is_printable<char>(const char ch) noexcept
+
2332 {
+
2333 return static_cast<const bool>(std::isprint(static_cast<unsigned char>(ch)));
+
2334 }
+
2335
+
2337 template<>
+
2338 [[nodiscard]]
+
2339 inline const bool is_printable<wchar_t>(const wchar_t ch) noexcept
+
2340 {
+
2341 return static_cast<const bool>(std::iswprint(ch));
+
2342 }
+
2343
+
2344
+
2345 //--- is_punctuation() ------------------------------------
+
2347 template<class CharT>
+
2348 [[nodiscard]]
+
2349 inline const bool is_punctuation(const CharT ch) noexcept
+
2350 {
+
2351 return false;
+
2352 }
+
2353
+
2355 template<>
+
2356 [[nodiscard]]
+
2357 inline const bool is_punctuation<char>(const char ch) noexcept
+
2358 {
+
2359 return static_cast<const bool>(std::ispunct(static_cast<unsigned char>(ch)));
+
2360 }
+
2361
+
2363 template<>
+
2364 [[nodiscard]]
+
2365 inline const bool is_punctuation<wchar_t>(const wchar_t ch) noexcept
+
2366 {
+
2367 return static_cast<const bool>(std::iswpunct(ch));
+
2368 }
+
2369
+
2370
+
2371 //--- is_space() ------------------------------------------
+
2373 template<class CharT>
+
2374 [[nodiscard]]
+
2375 inline const bool is_space(const CharT ch) noexcept
+
2376 {
+
2377 return false;
+
2378 }
+
2379
+
2381 template<>
+
2382 [[nodiscard]]
+
2383 inline const bool is_space<char>(const char ch) noexcept
+
2384 {
+
2385 return static_cast<const bool>(std::isspace(static_cast<unsigned char>(ch)));
+
2386 }
+
2387
+
2389 template<>
+
2390 [[nodiscard]]
+
2391 inline const bool is_space<wchar_t>(const wchar_t ch) noexcept
+
2392 {
+
2393 return static_cast<const bool>(std::iswspace(ch));
+
2394 }
+
2395
+
2396
+
2397 //--- is_upper() ------------------------------------------
+
2399 template<class CharT>
+
2400 [[nodiscard]]
+
2401 inline const bool is_upper(const CharT ch) noexcept
+
2402 {
+
2403 return false;
+
2404 }
+
2405
+
2407 template<>
+
2408 [[nodiscard]]
+
2409 inline const bool is_upper<char>(const char ch) noexcept
+
2410 {
+
2411 return static_cast<const bool>(std::isupper(static_cast<unsigned char>(ch)));
+
2412 }
+
2413
+
2415 template<>
+
2416 [[nodiscard]]
+
2417 inline const bool is_upper<wchar_t>(const wchar_t ch) noexcept
+
2418 {
+
2419 return static_cast<const bool>(std::iswupper(ch));
+
2420 }
+
2421
+
2422
+
2423 //--- swap_case() -----------------------------------------
+
2425 template<class CharT>
+
2426 [[nodiscard]]
+
2427 inline const CharT swap_case(const CharT ch) noexcept
+
2428 {
+
2429 if (pcs::is_lower(ch))
+
2430 return pcs::to_upper(ch);
+
2431 else if (pcs::is_upper(ch))
+
2432 return pcs::to_lower(ch);
+
2433 else
+
2434 return ch;
+
2435 }
+
2436
+
2437
+
2438 //--- to_lower() ------------------------------------------
+
2440 template<class CharT>
+
2441 [[nodiscard]]
+
2442 inline const CharT to_lower(const CharT ch) noexcept
+
2443 {
+
2444 return ch;
+
2445 }
+
2446
+
2448 template<>
+
2449 [[nodiscard]]
+
2450 inline const char to_lower<char>(const char ch) noexcept
+
2451 {
+
2452 return std::tolower(static_cast<unsigned char>(ch));
+
2453 }
+
2454
+
2456 template<>
+
2457 [[nodiscard]]
+
2458 inline const wchar_t to_lower<wchar_t>(const wchar_t ch) noexcept
+
2459 {
+
2460 return std::towlower(ch);
+
2461 }
+
2462
+
2463
+
2464 //--- to_upper() ------------------------------------------
+
2466 template<class CharT>
+
2467 [[nodiscard]]
+
2468 inline const CharT to_upper(const CharT ch) noexcept
+
2469 {
+
2470 return ch;
+
2471 }
+
2472
+
2474 template<>
+
2475 [[nodiscard]]
+
2476 inline const char to_upper<char>(const char ch) noexcept
+
2477 {
+
2478 return std::toupper(static_cast<unsigned char>(ch));
+
2479 }
+
2480
+
2482 template<>
+
2483 [[nodiscard]]
+
2484 inline const wchar_t to_upper<wchar_t>(const wchar_t ch) noexcept
+
2485 {
+
2486 return std::towupper(ch);
+
2487 }
+
2488
+
2489#if defined(_MSC_VER)
+
2490# pragma warning(pop) // to avoid boring warnings with litteral operators definitions
+
2491#endif
+
2492
+
2493} // end of namespace pcs // (pythonic c++ strings)
+
TransTable(Key1It first_key, Key1It last_key, ValueIt first_value, ValueIt last_value, Key2It first_not_translated, Key2It last_not_translated)
Creates a TransTable from three containers iterators (#9).
Definition cppstrings.h:317
+
TransTable(const std::map< key_type, value_type > trans_table)
Creates a TransTable from a standard map (#1).
Definition cppstrings.h:197
+
TransTable(const StringViewLike &keys, const StringViewLike &values)
Creates a TransTable from two string views (#10).
Definition cppstrings.h:338
+
TransTable(KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)
Creates a TransTable from two containers iterators (#8).
Definition cppstrings.h:300
+
TransTable(const CppStringT &keys, const CppStringT &values)
Creates a TransTable from two strings (#2).
Definition cppstrings.h:207
+
TransTable(const CharT *keys, const CharT *values, const CharT *not_translated)
Creates a TransTable from three pointers to null-terminated lists of characters (#7).
Definition cppstrings.h:285
+
TransTable() noexcept=default
Default empty constructor.
+
value_type operator[](const key_type ch) noexcept
Indexing operator.
Definition cppstrings.h:365
+
TransTable(const CharT *keys, const CharT *values)
Creates a TransTable from two pointers to null-terminated lists of characters (#6).
Definition cppstrings.h:271
+
TransTable(const CppStringT &keys, const CppStringT &values, const CppStringT &not_translated)
Creates a TransTable from three strings (#3).
Definition cppstrings.h:223
+
TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > &values)
Creates a TransTable from a string and an initalization list (#4).
Definition cppstrings.h:239
+
std::map< typename key_type, typename value_type > & get_table() noexcept
< for tests purposes
Definition cppstrings.h:376
+
TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > values, const CppStringT &not_translated)
Creates a TransTable from a string, an initalization list and a string (#5).
Definition cppstrings.h:255
+
This is the templated base class for all CppString classes.
Definition cppstrings.h:166
+
CppStringT strip(const CppStringT &removedchars) const noexcept
Returns a copy of the string with the leading and trailing characters removed.
Definition cppstrings.h:1805
+
constexpr bool contains_n(const CppStringT &sub, const size_type start, const size_type count=-1) const noexcept
Returns true if the passed string is found within the slice str[start:start+count-1],...
Definition cppstrings.h:512
+
std::vector< CppStringT > rsplit(const CppStringT &sep) noexcept
Returns a vector of the words in the whole string, using sep as the delimiter string.
Definition cppstrings.h:1491
+
CppStringT removeprefix(const CppStringT &prefix) const noexcept
If the string starts with the prefix string, returns a new string with the prefix removed....
Definition cppstrings.h:1223
+
constexpr bool contains(const CppStringT &substr) const noexcept
Returns true if this string contains the passed string, or false otherwise.
Definition cppstrings.h:479
+
CppStringT operator*(std::int64_t count) const noexcept
Generates a new string with count times the content of this string.
Definition cppstrings.h:1186
+
const bool isdecimal() const noexcept
Returns true if all characters in the string are decimal characters and there is at least one charact...
Definition cppstrings.h:841
+
std::vector< CppStringT > splitlines(const bool keep_end=false) const noexcept
Return a list of the lines in the string, breaking at line boundaries.
Definition cppstrings.h:1671
+
CppStringT strip() const noexcept
Returns a copy of the string with the leading and trailing whitespaces removed.
Definition cppstrings.h:1812
+
CppStringT title() const noexcept
Returns a titlecased copy of the string where words start with an uppercase character and the remaini...
Definition cppstrings.h:1848
+
constexpr size_type index_n(const CppStringT &sub, const size_type count) const
Like find_n(sub, count), but raises NotFoundException when the substring is not found.
Definition cppstrings.h:790
+
CppStringT & format(const std::basic_format_string< char, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
Definition cppstrings.h:737
+
CppStringT operator()(Slice< IntT > slice) const noexcept
Generates a new string according to the specified slice.
Definition cppstrings.h:1144
+
const bool isdigit() const noexcept
Returns true if all characters in the string are digits and there is at least one character,...
Definition cppstrings.h:862
+
constexpr size_type find(const CppStringT &sub, const size_type start=0, const size_type end=-1) const noexcept
Returns the lowest index in the string where substring sub is found within the slice str[start:end],...
Definition cppstrings.h:666
+
constexpr size_type index(const CppStringT &sub, const size_type start=0, const size_type end=-1) const
Definition cppstrings.h:762
+
const bool ispunctuation() const noexcept
Returns true if the string contains only one character and if this character belongs to the ASCII pun...
Definition cppstrings.h:938
+
CppStringT translate(TransTable &table) noexcept
Returns a copy of the string in which each character has been mapped through the given translation ta...
Definition cppstrings.h:1870
+
constexpr size_type rindex(const CppStringT &sub, const size_type start) const
Like rfind(sub, start), but raises NotFoundException when the substring is not found.
Definition cppstrings.h:1398
+
CppStringT expand_tabs(const size_type tabsize=8) const noexcept
Returns a copy of the string where all tab characters are replaced by one or more spaces,...
Definition cppstrings.h:626
+
CppStringT join(const CppStringT &s) const noexcept
Single parameter signature. Returns a copy of this parameter.
Definition cppstrings.h:1043
+
const bool startswith(const std::initializer_list< CppStringT > &prefixes, const size_type start, const size_type end) const noexcept
Returns true if the string starts with any of the specified prefixes, otherwise returns false....
Definition cppstrings.h:1760
+
std::vector< CppStringT > rsplit(const size_type maxsplit) noexcept
Returns a vector of the words in the string, as seperated with whitespace strings....
Definition cppstrings.h:1498
+
const bool startswith_n(const CppStringT &prefix, const size_type start, const size_type count) const noexcept
Returns true if the string starts with the specified suffix, otherwise returns false....
Definition cppstrings.h:1777
+
const bool endswith(const CppStringT &suffix) const noexcept
Returns true if the string ends with the specified suffix, otherwise returns false....
Definition cppstrings.h:579
+
const bool endswith(const CppStringT &suffix, const size_type start, const size_type end) const noexcept
Returns true if the string ends with the specified suffix, otherwise returns false....
Definition cppstrings.h:565
+
const bool isalpha() const noexcept
Returns true if all characters in the string are alphabetic and there is at least one character,...
Definition cppstrings.h:815
+
CppStringT capitalize() noexcept
Returns a copy of the string with its first character capitalized and the rest lowercased.
Definition cppstrings.h:443
+
const bool endswith_n(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type count) const noexcept
Returns true if the string ends with any of the specified suffixes, otherwise returns false....
Definition cppstrings.h:617
+
constexpr size_type rfind_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept
Returns the highest index in the string where substring sub is found within the slice str[start:start...
Definition cppstrings.h:1353
+
CppStringT join(const CppStringT &first, const NextCppStringsT &... others) const noexcept
Returns a string which is the concatenation of the strings in the parameters list.
Definition cppstrings.h:1035
+
constexpr size_type rindex(const CppStringT &sub) const
Like rfind(sub), but raises NotFoundException when the substring is not found.
Definition cppstrings.h:1409
+
std::vector< CppStringT > split(const CppStringT &sep, const size_type maxsplit) noexcept
Returns a vector of the words in the string, using sep as the delimiter string. At most maxsplit spli...
Definition cppstrings.h:1614
+
const bool isnumeric() const noexcept
Returns true if all characters in the string are numeric characters, and there is at least one charac...
Definition cppstrings.h:915
+
constexpr size_type count_n(const CppStringT &sub, const size_type length) const noexcept
Returns the number of non-overlapping occurrences of substring sub in the range [0,...
Definition cppstrings.h:556
+
const bool startswith(const CppStringT &prefix, const size_type start, const size_type end) const noexcept
Returns true if the string starts with the specified prefix, otherwise returns false....
Definition cppstrings.h:1739
+
CppStringT & format(const std::basic_format_string< T, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
Formats this string according to c++20 std::format() specification. Returns this string.
Definition cppstrings.h:728
+
std::vector< CppStringT > rpartition(const CppStringT &sep) const noexcept
Splits the string at the last occurrence of sep, and returns a 3-items vector containing the part bef...
Definition cppstrings.h:1462
+
const bool endswith_n(const CppStringT &suffix, const size_type count) const noexcept
Returns true if the string ends with the specified suffix, otherwise returns false....
Definition cppstrings.h:610
+
CppStringT rjust(const size_type width, const value_type fillch=value_type(' ')) const noexcept
Returns the string right justified in a string of length width.
Definition cppstrings.h:1446
+
const bool isprintable() const noexcept
Returns true if all characters in the string are printable or if the string is empty,...
Definition cppstrings.h:929
+
constexpr size_type rindex(const CppStringT &sub, const size_type start, const size_type end) const
Like rfind(sub, start, end), but raises NotFoundException when the substring is not found.
Definition cppstrings.h:1383
+
CppStringT & upper() noexcept
In-place replaces all characters of the string with their uppercase conversion. Returns a reference t...
Definition cppstrings.h:1887
+
CppStringT swapcase() const noexcept
Returns a copy of the string with uppercase characters converted to lowercase and vice versa.
Definition cppstrings.h:1837
+
constexpr size_type find_n(const CppStringT &sub, const size_type count) const noexcept
Returns the lowest index in the string where substring sub is found within the slice str[0:count-1],...
Definition cppstrings.h:719
+
static const value_type lower(const value_type ch) noexcept
Returns lowercase conversion of the character.
Definition cppstrings.h:1095
+
const bool endswith(const CppStringT &suffix, const size_type end) const noexcept
Returns true if the string ends with the specified suffix, otherwise returns false....
Definition cppstrings.h:572
+
const bool isascii() const noexcept
Returns true if the string is empty or all characters in the string are ASCII, or false otherwise.
Definition cppstrings.h:827
+
const bool is_words_sep() const noexcept
Returns true if there are only whitespace and punctuation characters in the string and there is at le...
Definition cppstrings.h:982
+
constexpr size_type count_n(const CppStringT &sub, const size_type start, const size_type length) const noexcept
Returns the number of non-overlapping occurrences of substring sub in the range [start,...
Definition cppstrings.h:549
+
constexpr size_type rfind_n(const CppStringT &sub, const size_type count) const noexcept
Returns the highest index in the string where substring sub is found within the slice str[0:count-1],...
Definition cppstrings.h:1367
+
constexpr size_type count(const CppStringT &sub, const size_type start=0, const size_type end=-1) const noexcept
Returns the number of non-overlapping occurrences of substring sub in the range [start,...
Definition cppstrings.h:526
+
std::vector< CppStringT > split() noexcept
Returns a vector of the words in the whole string, as seperated with whitespace strings.
Definition cppstrings.h:1578
+
const bool endswith_n(const CppStringT &suffix, const size_type start, const size_type count) const noexcept
Returns true if the string ends with the specified suffix, otherwise returns false....
Definition cppstrings.h:603
+
std::vector< CppStringT > rsplit() noexcept
Returns a vector of the words in the whole string, as seperated with whitespace strings.
Definition cppstrings.h:1484
+
CppStringT rstrip() const noexcept
Returns a copy of the string with trailing whitespaces removed.
Definition cppstrings.h:1562
+
const bool endswith(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type end) const noexcept
Returns true if the string ends with any of the specified suffixes, otherwise returns false....
Definition cppstrings.h:586
+
CppStringT rstrip(const CppStringT &removedchars) const noexcept
Returns a copy of the string with trailing characters removed.
Definition cppstrings.h:1552
+
std::vector< CppStringT > split(const size_type maxsplit) noexcept
Returns a vector of the words in the string, as seperated with whitespace strings....
Definition cppstrings.h:1607
+
const bool isalnum() const noexcept
Returns true if all characters in the string are alphanumeric and there is at least one character,...
Definition cppstrings.h:799
+
const bool isidentifier() const noexcept
Returns true if the string is not empty and is a valid identifier according to the language definitio...
Definition cppstrings.h:889
+
CppStringT & format(const std::basic_format_string< wchar_t, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
Definition cppstrings.h:746
+
const bool isspace() const noexcept
Returns true if there are only whitespace characters in the string and there is at least one characte...
Definition cppstrings.h:947
+
CppStringT substr(const size_type start, const size_type count=-1) const noexcept
Definition cppstrings.h:1821
+
CppStringT join(const std::vector< CppStringT > &strs) const noexcept
Returns a string which is the concatenation of the strings in the vector parameter.
Definition cppstrings.h:1017
+
constexpr size_type rfind(const CppStringT &sub, const size_type start) const noexcept
Returns the highest index in the string where substring sub is found starting at start position in st...
Definition cppstrings.h:1316
+
const CppStringT join() const noexcept
Empty parameters list signature. Returns a copy of current string.
Definition cppstrings.h:1050
+
std::vector< CppStringT > rsplit(const CppStringT &sep, const size_type maxsplit) noexcept
Returns a vector of the words in the string, using sep as the delimiter string. At most maxsplit spli...
Definition cppstrings.h:1505
+
const bool startswith_n(const std::initializer_list< CppStringT > &prefix, const size_type start, const size_type count) const noexcept
Returns true if the string starts with any of the specified suffixes, otherwise returns false....
Definition cppstrings.h:1791
+
constexpr size_type rfind(const CppStringT &sub) const noexcept
Returns the highest index in the string where C-substring sub is found in the whole string,...
Definition cppstrings.h:1337
+
CppStringT lstrip() const noexcept
Returns a copy of the string with leading whitespaces removed.
Definition cppstrings.h:1120
+
CppStringT join(const std::array< CppStringT, N > &strs) const noexcept
Returns a string which is the concatenation of the strings in the array parameter.
Definition cppstrings.h:1000
+
constexpr size_type rindex_n(const CppStringT &sub, const size_type count) const
Like rfind_n(sub, count), but raises NotFoundException when the substring is not found.
Definition cppstrings.h:1433
+
constexpr size_type find_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept
Returns the lowest index in the string where substring sub is found within the slice str[start:start+...
Definition cppstrings.h:691
+
std::vector< CppStringT > partition(const CppStringT &sep) const noexcept
Splits the string at the first occurrence of sep, and returns a 3-items vector containing the part be...
Definition cppstrings.h:1205
+
std::vector< CppStringT > split(const CppStringT &sep) noexcept
Returns a vector of the words in the whole string, using sep as the delimiter string.
Definition cppstrings.h:1597
+
const bool startswith(const CppStringT &prefix, const size_type start) const noexcept
Returns true if the string starts with the specified prefix, otherwise returns false....
Definition cppstrings.h:1746
+
CppStringT zfill(const size_type width) const noexcept
Returns a copy of the string left filled with ASCII '0' digits to make a string of length width.
Definition cppstrings.h:1914
+
CppStringT replace(const CppStringT &old, const CppStringT &new_, size_type count=-1) const noexcept
Returns a copy of the string with first count occurrences of substring 'old' replaced by 'new_'.
Definition cppstrings.h:1251
+
CppStringT & lower() noexcept
In-place replaces all characters of the string with their lowercase conversion. Returns a reference t...
Definition cppstrings.h:1078
+
CppStringT removesuffix(const CppStringT &suffix) const noexcept
If the string ends with the suffix string, returns a new string with the suffix removed....
Definition cppstrings.h:1237
+
const bool istitle() const noexcept
Returns true if the string is a titlecased string and there is at least one character,...
Definition cppstrings.h:964
+
const bool startswith_n(const CppStringT &prefix, const size_type count) const noexcept
Returns true if the string starts with the specified suffix, otherwise returns false....
Definition cppstrings.h:1784
+
const bool startswith(const CppStringT &prefix) const noexcept
Returns true if the string starts with the specified prefix, otherwise returns false....
Definition cppstrings.h:1753
+
const bool islower() const noexcept
Returns true if all cased characters in the string are lowercase and there is at least one cased char...
Definition cppstrings.h:898
+
CppStringT ljust(const size_type width, const value_type fillch=value_type(' ')) const noexcept
Returns the string left justified in a string of length width.
Definition cppstrings.h:1063
+
CppStringT lstrip(const CppStringT &removedchars) const noexcept
Returns a copy of the string with leading characters removed.
Definition cppstrings.h:1110
+
constexpr size_type index_n(const CppStringT &sub, const size_type start, const size_type count) const
Like find_n(sub, start, count), but raises NotFoundException when the substring is not found.
Definition cppstrings.h:779
+
CppStringT center(const size_type width, const value_type fillch=value_type(' ')) const noexcept
Returns a copy of the string centered in a string of length width.
Definition cppstrings.h:462
+
const bool isupper() const noexcept
Returns true if all cased characters in the string are uppercase and there is at least one cased char...
Definition cppstrings.h:973
+
constexpr size_type rfind(const CppStringT &sub, const size_type start, const size_type end) const noexcept
Returns the highest index in the string where substring sub is found within the slice str[start:end],...
Definition cppstrings.h:1288
+
static const value_type upper(const value_type ch) noexcept
Returns uppercase conversion of the character.
Definition cppstrings.h:1900
+
constexpr size_type rindex_n(const CppStringT &sub, const size_type start, const size_type count) const
Like rfind_n(sub, start, count), but raises NotFoundException when the substring is not found.
Definition cppstrings.h:1422
+
Base class for slices, with start, stop and step specified values.
Definition cppstrings.h:1949
+
IntT stop()
Returns the stop index of this slide.
Definition cppstrings.h:2001
+
IntT start()
Returns the start index of this slide.
Definition cppstrings.h:2000
+
IntT step()
Returns the step value of this slide.
Definition cppstrings.h:2002
+
Slice operator++() noexcept
< iterates one step, pre-increment. Caution: index may be out of bounds. Check '!end()' before derefe...
Definition cppstrings.h:1981
+
Slice operator++(int) noexcept
< iterates one step, post-increment. Caution: index may be out of bounds. Check '!...
Definition cppstrings.h:1987
+
Slice(const IntT start=DEFAULT, const IntT stop=DEFAULT, const IntT step=DEFAULT) noexcept
< Valued constructor
Definition cppstrings.h:1954
+
const IntT begin(const CppStringT< CharT > &str) noexcept
< starts iterating on specified CppString.
Definition cppstrings.h:1970
+
virtual ~Slice() noexcept=default
Default destructor.
+
const bool end() const noexcept
< returns true when iterating is over, or false otherwise.
Definition cppstrings.h:1976
+
const IntT operator*() noexcept
< dereferences the slice.
Definition cppstrings.h:1994
+
Definition cppstrings.h:41
+
const bool is_digit< wchar_t >(const wchar_t ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2241
+
const bool is_punctuation(const CharT ch) noexcept
Returns true if character ch is punctuation, or false otherwise.
Definition cppstrings.h:2349
+
const bool is_alpha< wchar_t >(const wchar_t ch) noexcept
Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settin...
Definition cppstrings.h:2179
+
CppStringT< char > CppString
Specialization of basic class with template argument 'char'.
Definition cppstrings.h:53
+
const bool is_printable< char >(const char ch) noexcept
Returns true if character ch is printable, or false otherwise.
Definition cppstrings.h:2331
+
const bool is_numeric< char >(const char ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2305
+
const bool is_decimal< char >(const char ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2207
+
const bool is_lower< char >(const char ch) noexcept
Returns true if character ch is lowercase, or false otherwise. Conforms to the current locale setting...
Definition cppstrings.h:2279
+
const bool is_printable< wchar_t >(const wchar_t ch) noexcept
Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale setti...
Definition cppstrings.h:2339
+
const bool is_punctuation< wchar_t >(const wchar_t ch) noexcept
Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale setti...
Definition cppstrings.h:2365
+
const bool is_alpha(const CharT ch) noexcept
struct of slices with default start values
Definition cppstrings.h:2163
+
const char to_lower< char >(const char ch) noexcept
Returns the lowercase form of character ch if it exists, or ch itself otherwise. Conforms to the curr...
Definition cppstrings.h:2450
+
const bool is_printable(const CharT ch) noexcept
Returns true if character ch is printable, or false otherwise.
Definition cppstrings.h:2323
+
const bool is_digit(const CharT ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2225
+
const bool is_space< wchar_t >(const wchar_t ch) noexcept
Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settin...
Definition cppstrings.h:2391
+
const CharT to_upper(const CharT ch) noexcept
Returns the uppercase form of character ch if it exists, or ch itself otherwise.
Definition cppstrings.h:2468
+
const bool is_decimal< wchar_t >(const wchar_t ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2215
+
const bool is_space< char >(const char ch) noexcept
Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settin...
Definition cppstrings.h:2383
+
CppStringT< wchar_t > CppWString
Specialization of basic class with template argument 'wchar_t'.
Definition cppstrings.h:54
+
const bool is_upper(const CharT ch) noexcept
Returns true if character is uppercase, or false otherwise.
Definition cppstrings.h:2401
+
const CharT to_lower(const CharT ch) noexcept
Returns the lowercase form of character ch if it exists, or ch itself otherwise.
Definition cppstrings.h:2442
+
const bool is_decimal(const CharT ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2199
+
const bool is_punctuation< char >(const char ch) noexcept
Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale setti...
Definition cppstrings.h:2357
+
const wchar_t to_upper< wchar_t >(const wchar_t ch) noexcept
Returns the uppercase form of character ch if it exists, or ch itself otherwise. Conforms to the curr...
Definition cppstrings.h:2484
+
const wchar_t to_lower< wchar_t >(const wchar_t ch) noexcept
Returns the lowercase form of character ch if it exists, or ch itself otherwise. Conforms to the curr...
Definition cppstrings.h:2458
+
const bool is_upper< wchar_t >(const wchar_t ch) noexcept
Returns true if character ch is uppercase, or false otherwise. Conforms to the current locale setting...
Definition cppstrings.h:2417
+
const char to_upper< char >(const char ch) noexcept
Returns the uppercase form of character ch if it exists, or ch itself otherwise. Conforms to the curr...
Definition cppstrings.h:2476
+
const bool is_id_start(const CharT ch) noexcept
Returns true if character is a starting char for identifiers, or false otherwise.
Definition cppstrings.h:2261
+
const bool is_upper< char >(const char ch) noexcept
Returns true if character ch is uppercase, or false otherwise. Conforms to the current locale setting...
Definition cppstrings.h:2409
+
const CharT swap_case(const CharT ch) noexcept
Returns the swapped case form of character ch if it exists, or ch itself otherwise.
Definition cppstrings.h:2427
+
const bool is_ascii(const CharT ch) noexcept
Returns true if character ch gets ASCII code, or false otherwise.
Definition cppstrings.h:2189
+
const bool is_numeric< wchar_t >(const wchar_t ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2313
+
const bool is_lower< wchar_t >(const wchar_t ch) noexcept
Returns true if character ch is lowercase, or false otherwise. Conforms to the current locale setting...
Definition cppstrings.h:2287
+
const bool is_alpha< char >(const char ch) noexcept
Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settin...
Definition cppstrings.h:2171
+
const bool is_lower(const CharT ch) noexcept
Returns true if character is lowercase, or false otherwise.
Definition cppstrings.h:2271
+
const bool is_id_continue(const CharT ch) noexcept
Returns true if character is a continuing char for identifiers, or false otherwise.
Definition cppstrings.h:2251
+
const bool is_space(const CharT ch) noexcept
Returns true if character ch is white space, or false otherwise.
Definition cppstrings.h:2375
+
const bool is_numeric(const CharT ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2297
+
const bool is_digit< char >(const char ch) noexcept
Returns true if character is a decimal digit, or false otherwise.
Definition cppstrings.h:2233
+
Base class for slices, with start, stop and step specified values.
Definition cppstrings.h:2065
+
virtual ~StartSlice() noexcept=default
Default destructor.
+
StartSlice(const IntT start=MyBaseClass::DEFAULT) noexcept
< Valued constructor
Definition cppstrings.h:2069
+
struct of slices with default step values
Definition cppstrings.h:2129
+
StartStepSlice(const IntT start=MyBaseClass::DEFAULT, const IntT step=MyBaseClass::DEFAULT) noexcept
< Valued constructor
Definition cppstrings.h:2133
+
virtual ~StartStepSlice() noexcept=default
Default destructor.
+
struct of slices with default start and stop values
Definition cppstrings.h:2113
+
StartStopSlice(const IntT start=MyBaseClass::DEFAULT, const IntT stop=MyBaseClass::DEFAULT) noexcept
< Valued constructor
Definition cppstrings.h:2117
+
virtual ~StartStopSlice() noexcept=default
Default destructor.
+
struct of slices with default start and step values
Definition cppstrings.h:2097
+
virtual ~StepSlice() noexcept=default
Default destructor.
+
StepSlice(const IntT step=MyBaseClass::DEFAULT) noexcept
< Valued constructor
Definition cppstrings.h:2101
+
struct of slices with default stop and step values
Definition cppstrings.h:2081
+
virtual ~StopSlice() noexcept=default
Default destructor.
+
StopSlice(const IntT stop=MyBaseClass::DEFAULT) noexcept
< Valued constructor
Definition cppstrings.h:2085
+
struct of slices with default stop values
Definition cppstrings.h:2146
+
StopStepSlice(const IntT stop=MyBaseClass::DEFAULT, const IntT step=MyBaseClass::DEFAULT) noexcept
< Valued constructor
Definition cppstrings.h:2150
+
virtual ~StopStepSlice() noexcept=default
Default destructor.
+
+
+
+ + + + diff --git a/cpp-strings/html/doxygen.css b/cpp-strings/html/doxygen.css new file mode 100644 index 0000000..df33d6b --- /dev/null +++ b/cpp-strings/html/doxygen.css @@ -0,0 +1,2468 @@ +/* The standard CSS for doxygen 1.14.0*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #3D578C; +--page-external-link-color: #334975; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--group-header-separator-color: #D9E0EE; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 75px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #C4CFE5; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #C4CFE5; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +/* +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg');*/ +--icon-folder-open-fill-color: #C4CFE5; +--icon-folder-fill-color: #D8DFEE; +--icon-folder-border-color: #4665A2; +--icon-doc-fill-color: #D8DFEE; +--icon-doc-border-color: #4665A2; + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; +--memdecl-border-color: #D5DDEC; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-proto-background-color: #EEF1F7; +--memdef-proto-text-color: #253555; +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-border-color: #C4CFE5; +--nav-breadcrumb-separator-color: #C4CFE5; +--nav-breadcrumb-active-bg: #EEF1F7; +--nav-breadcrumb-color: #354C7B; +--nav-breadcrumb-border-color: #E1E7F2; +--nav-splitbar-bg-color: #DCE2EF; +--nav-splitbar-handle-color: #9CAFD4; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-active-bg: #DCE2EF; +--nav-menu-active-color: #9CAFD4; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #B6C4DF; +--nav-arrow-selected-color: #90A5CE; + +/* sync icon */ +--sync-icon-border-color: #C4CFE5; +--sync-icon-background-color: #F9FAFC; +--sync-icon-selected-background-color: #EEF1F7; +--sync-icon-color: #C4CFE5; +--sync-icon-selected-color: #6884BD; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-active-color: black; +--search-filter-background-color: rgba(255,255,255,.7); +--search-filter-backdrop-filter: blur(4px); +--search-filter-foreground-color: black; +--search-filter-border-color: rgba(150,150,150,.4); +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: rgba(255,255,255,.8); +--search-results-backdrop-filter: blur(4px); +--search-results-border-color: rgba(150,150,150,.4); +--search-box-border-color: #B6C4DF; +--search-close-icon-bg-color: #A0A0A0; +--search-close-icon-fg-color: white; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--tooltip-foreground-color: black; +--tooltip-background-color: rgba(255,255,255,0.8); +--tooltip-arrow-background-color: white; +--tooltip-border-color: rgba(150,150,150,0.7); +--tooltip-backdrop-filter: blur(3px); +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 0 4px 8px 0 rgba(0,0,0,.25); +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #90A5CE; +--page-external-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--group-header-separator-color: #1D2A43; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #212F4B; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #2C3F65; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-folder-open-fill-color: #4665A2; +--icon-folder-fill-color: #5373B4; +--icon-folder-border-color: #C4CFE5; +--icon-doc-fill-color: #6884BD; +--icon-doc-border-color: #C4CFE5; + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; +--memdecl-border-color: #233250; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-border-color: #212F4B; +--nav-breadcrumb-separator-color: #212F4B; +--nav-breadcrumb-active-bg: #1D2A43; +--nav-breadcrumb-color: #90A5CE; +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-bg-color: #283A5D; +--nav-splitbar-handle-color: #4665A2; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-active-bg: #1D2A43; +--nav-menu-active-color: #C9D3E7; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #4665A2; +--nav-arrow-selected-color: #6884BD; + +/* sync icon */ +--sync-icon-border-color: #212F4B; +--sync-icon-background-color: #101826; +--sync-icon-selected-background-color: #1D2A43; +--sync-icon-color: #4665A2; +--sync-icon-selected-color: #5373B4; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-active-color: #F5F5F5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-backdrop-filter: none; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: black; +--search-results-foreground-color: #90A5CE; +--search-results-backdrop-filter: none; +--search-results-border-color: #334975; +--search-box-border-color: #334975; +--search-close-icon-bg-color: #909090; +--search-close-icon-fg-color: black; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-arrow-background-color: #202020; +--tooltip-backdrop-filter: none; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +body.resizing { + user-select: none; + -webkit-user-select: none; +} + +#doc-content { + scrollbar-width: thin; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 160%; + font-weight: 400; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + box-shadow: 12px 0 var(--page-background-color), + -12px 0 var(--page-background-color), + 12px 1px var(--group-header-separator-color), + -12px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +td h2.groupheader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + margin-right: 6px; + padding-right: 6px; + text-align: right; + line-height: 110%; + background-color: var(--nav-background-color); +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + padding-right: 6px; + padding-left: 6px; + border-radius: 0 6px 6px 0; + background-color: var(--nav-menu-active-bg); +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +span.label a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.el, a.el:visited, a.code, a.code:visited, a.line, a.line:visited { + color: var(--page-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--page-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style:none; + text-indent: -16px; + padding-left: 38px; +} +li.unchecked:before { + content: "\2610\A0"; +} +li.checked:before { + content: "\2611\A0"; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +span.tt { + white-space: pre; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .4; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: wrap; + word-break: break-all; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -62px; + padding-left: 62px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + display: inline-block; + width: 12px; + height: 12px; + margin-left: 4px; + margin-right: 1px; +} + +span.foldnone { + display: inline-block; + position: relative; + cursor: pointer; + user-select: none; +} + +span.fold.plus, span.fold.minus { + width: 10px; + height: 10px; + background-color: var(--fragment-background-color); + position: relative; + border: 1px solid var(--fold-line-color); + margin-right: 1px; +} + +span.fold.plus::before, span.fold.minus::before { + content: ''; + position: absolute; + background-color: var(--fold-line-color); +} + +span.fold.plus::before { + width: 2px; + height: 6px; + top: 2px; + left: 4px; +} + +span.fold.plus::after { + content: ''; + position: absolute; + width: 6px; + height: 2px; + top: 4px; + left: 2px; + background-color: var(--fold-line-color); +} + +span.fold.minus::before { + width: 6px; + height: 2px; + top: 4px; + left: 2px; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 110%; + font-weight: 500; + margin-left: 0px; + margin-top: 0em; + margin-bottom: 6px; + padding-top: 8px; + padding-bottom: 4px; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 12px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + border: none; + margin-top: 16px; + margin-bottom: 16px; + height: 1px; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight { + padding-top: 2px; + padding-bottom: 2px; +} + +.memTemplParams { + padding-left: 10px; + padding-top: 5px; +} + +.memItemLeft, .memItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +tr[class^='memdesc'] { + box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,.075); +} + +.mdescLeft { + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.mdescRight { + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; + border-left: 1px solid var(--memdecl-border-color); + border-right: 1px solid var(--memdecl-border-color); +} + +td.ititle { + border: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding-left: 10px; +} + +tr:not(:first-child) > td.ititle { + border-top: 0; + border-radius: 0; +} + +.memItemLeft { + white-space: nowrap; + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-left: 10px; + transition: none; +} + +.memItemRight { + width: 100%; + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-right: 10px; + transition: none; +} + +tr.heading + tr[class^='memitem'] td.memItemLeft, +tr.groupHeader + tr[class^='memitem'] td.memItemLeft, +tr.inherit_header + tr[class^='memitem'] td.memItemLeft { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memItemRight, +tr.groupHeader + tr[class^='memitem'] td.memItemRight, +tr.inherit_header + tr[class^='memitem'] td.memItemRight { + border-top: 1px solid var(--memdecl-border-color); + border-top-right-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memTemplParams, +tr.heading + tr td.ititle, +tr.groupHeader + tr[class^='memitem'] td.memTemplParams, +tr.groupHeader + tr td.ititle, +tr.inherit_header + tr[class^='memitem'] td.memTemplParams { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemLeft, +table.memberdecls tr:last-child td.mdescLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft { + border-bottom-left-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemRight, +table.memberdecls tr:last-child td.mdescRight, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight { + border-bottom-right-radius: 4px; +} + +tr.template .memItemLeft, tr.template .memItemRight { + border-top: none; + padding-top: 0; +} + + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-color: var(--memdef-proto-background-color); + line-height: 1.25; + font-family: var(--font-family-monospace); + font-weight: 500; + font-size: 16px; + float:left; + box-shadow: 0 10px 0 -1px var(--memdef-proto-background-color), + 0 2px 8px 0 rgba(0,0,0,.075); + position: relative; +} + +.memtitle:after { + content: ''; + display: block; + background: var(--memdef-proto-background-color); + height: 10px; + bottom: -10px; + left: 0px; + right: -14px; + position: absolute; + border-top-right-radius: 6px; +} + +.permalink +{ + font-family: var(--font-family-monospace); + font-weight: 500; + line-height: 1.25; + font-size: 16px; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-family: var(--font-family-monospace); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + display: table !important; + width: 100%; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + border-radius: 4px; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-family: var(--font-family-monospace); + font-size: 13px; + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + background-color: var(--memdef-proto-background-color); + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-background-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 14px; + transition: opacity 0.3s ease; +} + +span.arrowhead { + position: relative; + padding: 0; + margin: 0 0 0 2px; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(-45deg); + transition: transform 0.3s ease; +} + +span.arrowhead.opened { + transform: rotate(45deg); +} + +.selected span.arrowhead { + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color); +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfolder { + width: 24px; + height: 18px; + margin-top: 6px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.icondoc { + width: 24px; + height: 18px; + margin-top: 3px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.folder-icon { + width: 16px; + height: 11px; + background-color: var(--icon-folder-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 0 2px 2px 2px; + position: relative; + box-sizing: content-box; +} + +.folder-icon::after { + content: ''; + position: absolute; + top: 2px; + left: -1px; + width: 16px; + height: 7px; + background-color: var(--icon-folder-open-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 7px 7px 2px 2px; + transform-origin: top left; + opacity: 0; + transition: all 0.3s linear; +} + +.folder-icon::before { + content: ''; + position: absolute; + top: -3px; + left: -1px; + width: 6px; + height: 2px; + background-color: var(--icon-folder-fill-color); + border-top: 1px solid var(--icon-folder-border-color); + border-left: 1px solid var(--icon-folder-border-color); + border-right: 1px solid var(--icon-folder-border-color); + border-radius: 2px 2px 0 0; +} + +.folder-icon.open::after { + top: 3px; + opacity: 1; +} + +.doc-icon { + left: 6px; + width: 12px; + height: 16px; + background-color: var(--icon-doc-border-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: relative; + display: inline-block; +} +.doc-icon::before { + content: ""; + left: 1px; + top: 1px; + width: 10px; + height: 14px; + background-color: var(--icon-doc-fill-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: absolute; + box-sizing: border-box; +} +.doc-icon::after { + content: ""; + left: 7px; + top: 0px; + width: 3px; + height: 3px; + background-color: transparent; + position: absolute; + border: 1px solid var(--icon-doc-border-color); +} + + + + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +span.dynarrow { + position: relative; + display: inline-block; + width: 12px; + bottom: 1px; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +/* ----------- navigation breadcrumb styling ----------- */ + +#nav-path ul { + height: 30px; + line-height: 30px; + color: var(--nav-text-normal-color); + overflow: hidden; + margin: 0px; + padding-left: 4px; + background-image: none; + background: var(--page-background-color); + border-bottom: 1px solid var(--nav-breadcrumb-separator-color); + font-size: var(--nav-font-size-level1); + font-family: var(--font-family-nav); + position: relative; + z-index: 100; +} + +#main-nav { + border-bottom: 1px solid var(--nav-border-color); +} + +.navpath li { + list-style-type:none; + float:left; + color: var(--nav-foreground-color); +} + +.navpath li.footer { + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + font-size: 8pt; + color: var(--footer-foreground-color); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; + padding-left: 15px; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--nav-breadcrumb-color); + position: relative; + top: 0px; + height: 30px; + margin-right: -20px; +} + +#nav-path li.navelem:after { + content: ''; + display: inline-block; + position: relative; + top: 0; + right: -15px; + width: 30px; + height: 30px; + transform: scaleX(0.5) scale(0.707) rotate(45deg); + z-index: 10; + background: var(--page-background-color); + box-shadow: 2px -2px 0 2px var(--nav-breadcrumb-separator-color); + border-radius: 0 5px 0 50px; +} + +#nav-path li.navelem:first-child { + margin-left: -6px; +} + +#nav-path li.navelem:hover, +#nav-path li.navelem:hover:after { + background-color: var(--nav-breadcrumb-active-bg); +} + +/* ---------------------- */ + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + margin: 0px; + background-color: var(--header-background-color); + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl { + padding: 0 0 0 0; +} + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0; + padding: 0; +} + +#side-nav #projectname +{ + font-size: 130%; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0 0 0 5px; + margin: 0px; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: 400; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0 2px 0; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 12px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + backdrop-filter: var(--tooltip-backdrop-filter); + -webkit-backdrop-filter: var(--tooltip-backdrop-filter); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd +{ + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + + +html { +--timestamp: 'Wed Jul 16 2025' +} +span.timestamp { content: ' '; } +span.timestamp:before { content: var(--timestamp); } + +:root { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/cpp-strings/html/doxygen.svg b/cpp-strings/html/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/cpp-strings/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cpp-strings/html/doxygen_crawl.html b/cpp-strings/html/doxygen_crawl.html new file mode 100644 index 0000000..63ae5ec --- /dev/null +++ b/cpp-strings/html/doxygen_crawl.html @@ -0,0 +1,227 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cpp-strings/html/dynsections.js b/cpp-strings/html/dynsections.js new file mode 100644 index 0000000..0e15bd4 --- /dev/null +++ b/cpp-strings/html/dynsections.js @@ -0,0 +1,191 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.slideUp('fast'); + summary.show(); + $(linkObj).find('.arrowhead').addClass('closed').removeClass('opened'); + } else { + content.slideDown('fast'); + summary.hide(); + $(linkObj).find('.arrowhead').removeClass('closed').addClass('opened'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').addClass('plus').removeClass('minus'); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/cpp-strings/html/files.html b/cpp-strings/html/files.html new file mode 100644 index 0000000..c18cd38 --- /dev/null +++ b/cpp-strings/html/files.html @@ -0,0 +1,107 @@ + + + + + + + +cpp-strings: File List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+ + +
 
cppstrings.h
+
+
+
+
+ + + + diff --git a/cpp-strings/html/files_dup.js b/cpp-strings/html/files_dup.js new file mode 100644 index 0000000..0546064 --- /dev/null +++ b/cpp-strings/html/files_dup.js @@ -0,0 +1,4 @@ +var files_dup = +[ + [ "cppstrings.h", "cppstrings_8h_source.html", null ] +]; \ No newline at end of file diff --git a/cpp-strings/html/functions.html b/cpp-strings/html/functions.html new file mode 100644 index 0000000..e99d012 --- /dev/null +++ b/cpp-strings/html/functions.html @@ -0,0 +1,245 @@ + + + + + + + +cpp-strings: Class Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- b -

+ + +

- c -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- z -

+ + +

- ~ -

+
+
+
+ + + + diff --git a/cpp-strings/html/functions_func.html b/cpp-strings/html/functions_func.html new file mode 100644 index 0000000..ebc9f5d --- /dev/null +++ b/cpp-strings/html/functions_func.html @@ -0,0 +1,245 @@ + + + + + + + +cpp-strings: Class Members - Functions + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the class documentation for each member:
+ +

- b -

+ + +

- c -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- z -

+ + +

- ~ -

+
+
+
+ + + + diff --git a/cpp-strings/html/hierarchy.html b/cpp-strings/html/hierarchy.html new file mode 100644 index 0000000..07a5967 --- /dev/null +++ b/cpp-strings/html/hierarchy.html @@ -0,0 +1,121 @@ + + + + + + + +cpp-strings: Class Hierarchy + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + + + + + + + + + +
 Cstd::basic_string< Char >STL class
 Cpcs::CppStringT< char >
 Cpcs::CppStringT< wchar_t >
 Cpcs::CppStringT< CharT, TraitsT, AllocatorT >This is the templated base class for all CppString classes
 Cstd::exceptionSTL class
 Cstd::logic_errorSTL class
 Cpcs::CppStringT< CharT, TraitsT, AllocatorT >::NotFoundException
 Cpcs::Slice< IntT >Base class for slices, with start, stop and step specified values
 Cpcs::StartSlice< IntT >Base class for slices, with start, stop and step specified values
 Cpcs::StartStepSlice< IntT >Struct of slices with default step values
 Cpcs::StartStopSlice< IntT >Struct of slices with default start and stop values
 Cpcs::StepSlice< IntT >Struct of slices with default start and step values
 Cpcs::StopSlice< IntT >Struct of slices with default stop and step values
 Cpcs::StopStepSlice< IntT >Struct of slices with default stop values
 Cpcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTableThe internal class of translation tables, used with methods CppStringT::maketrans and CppStringT::translate
+
+
+
+
+ + + + diff --git a/cpp-strings/html/hierarchy.js b/cpp-strings/html/hierarchy.js new file mode 100644 index 0000000..252d447 --- /dev/null +++ b/cpp-strings/html/hierarchy.js @@ -0,0 +1,22 @@ +var hierarchy = +[ + [ "std::basic_string< Char >", null, [ + [ "pcs::CppStringT< char >", "classpcs_1_1_cpp_string_t.html", null ], + [ "pcs::CppStringT< wchar_t >", "classpcs_1_1_cpp_string_t.html", null ], + [ "pcs::CppStringT< CharT, TraitsT, AllocatorT >", "classpcs_1_1_cpp_string_t.html", null ] + ] ], + [ "std::exception", null, [ + [ "std::logic_error", null, [ + [ "pcs::CppStringT< CharT, TraitsT, AllocatorT >::NotFoundException", "classpcs_1_1_cpp_string_t_1_1_not_found_exception.html", null ] + ] ] + ] ], + [ "pcs::Slice< IntT >", "classpcs_1_1_slice.html", [ + [ "pcs::StartSlice< IntT >", "structpcs_1_1_start_slice.html", null ], + [ "pcs::StartStepSlice< IntT >", "structpcs_1_1_start_step_slice.html", null ], + [ "pcs::StartStopSlice< IntT >", "structpcs_1_1_start_stop_slice.html", null ], + [ "pcs::StepSlice< IntT >", "structpcs_1_1_step_slice.html", null ], + [ "pcs::StopSlice< IntT >", "structpcs_1_1_stop_slice.html", null ], + [ "pcs::StopStepSlice< IntT >", "structpcs_1_1_stop_step_slice.html", null ] + ] ], + [ "pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable", "classpcs_1_1_cpp_string_t_1_1_trans_table.html", null ] +]; \ No newline at end of file diff --git a/cpp-strings/html/index.html b/cpp-strings/html/index.html new file mode 100644 index 0000000..ecd46c6 --- /dev/null +++ b/cpp-strings/html/index.html @@ -0,0 +1,169 @@ + + + + + + + +cpp-strings: Library cpp-string + + + + + + + + + + + + + + +
+
+ + + + + + +
+
cpp-strings 1.0.0 +
+
Pythonic c++ strings
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Library cpp-string
+
+
+

+

license Latest release code_coverage tests

+

What if c++ strings where as easy to use as Python strings?

+

Let's just use c++ strings as are Python ones, with same API or as similar API as possible.
+ Library cpp-strings is fully templated. Just download header file cppstrings.h and put it anywhere in your project. Notice: all of its stuff is declared and defined in namespace pcs - which stands for P**ythonic **C++ **S**trings.

+
    +
  • The templated class pcs::CppStringT<> defines all constructors and methods that implement the equivalent of Python strings API.
    +
  • +
  • Class pcs::CppString specializes the templated class with char characters.
  • +
  • Class pcs::CppWString specializes the templated class with wchar_t characters.
  • +
+

cpp-strings is implemented with the currently most recent c++ standard available with gcc, clang and msvc c++ compilers, i.e. standard c++20.

+
    +
  • directory cpp-strings contains the header file cppstring.h.
    + This is the header file to include in your projects.
  • +
  • directory cpp-strings-tests contains the unit test file cpp-strings-tests.cpp
    + This file tests all the library stuff. It is a valuable code container with so many examples of use of the library, the classes, the methods and the functions it defines.
  • +
+

The code has been developed using VS2022 IDE. As such, unitary tests have been coded using Microsoft Visual Studio Cpp Unit Test Framework. The related VS project is provided with this library.

+

Notice: no clang, gcc or msvc specific declarations or goodies have been use to code library cpp-strings. It should then be compilable with any of these compilers. To be able to use it with your project, just ensure that the c++ standard used with you favorite compiler is c++20:

    +
  • options -std=c++20 or -std=c++latest for clang and gcc (v. 10 and above),
    + or option -std=c++2a for clang and gcc (v. 9 and earlier);
  • +
  • options /std=c++20 or /std=c++latest for Visual Studio 2019 and later.
  • +
+

If you want to run the unitary tests, well, use the last version of Visual Studio (i.e. VS 2022, by July 2025). The Community free version will truly be fine.
+ The vcproject associated with the unit tests in cpp-strings is already configured to use the option flag /std:c++latest since the implemented code uses a very few but very useful c++23 goodies.

+
+

+License

+
Library cpp-strings
+"What if c++ strings where as easy to use as Python strings?"
+
+Copyright (C) 2023-2025 Philippe Schmouker
+contact - ph (dot) schmouker (at) gmail (dot) com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation,  either version 3  of the License,  or
+(at your option) any later version.
+
+This program is distributed in the hope  that  it  will  be  useful,
+but  WITHOUT  ANY  WARRANTY;  without  even  the implied warranty of
+MERCHANTABILITY  or  FITNESS  FOR  A  PARTICULAR  PURPOSE.  See  the
+GNU General Public License for more details.
+
+You should have received a copy  of  the  GNU General Public License
+along with this program.  If not, see <https://www.gnu.org/licenses/>.
+

+

+Intro

+

The creation of this library has been started with the aim at easing the use of strings in c++. Other projects exist, even aiming also to implement a Python-like strings API, but the only ones we have found were either started but not completed, or were not implementing the whole Python API.

+

So, we started to work on Pythonic c++ strings. Library cpp-strings is now ready. It fully implements the Python API (even with a c++ implementation of slices) and it is fully tested with unitary tests.

+

The implementation of library cpp-strings is fully templated and is contained into a single header file: cpp-strings/cppstrings.h. To take a whole benefit of it, just add this header file to your project and include it in your own files. It very fastly compiles. That's all!

+

Header file cpp-strings/cppstrings.h defines:

    +
  • templated class template<typename CharT> class pcs::CppStringT which implements all the stuff about pythonic c++ strings. It inherits from c++ STL class std::basic_string<CharT>, so it gets access to all c++ STL methods, functions and goodies about strings;
  • +
  • this class is specialized by using pcs::CppString> = pcs::CppStringT<char> for pythonic c++ strings based on char characters;
  • +
  • it is also specialized by using pcs::CppWString> = pcs::CppStringT<wchar_t> for pythonic c++ strings based on wchar_t characters.
  • +
+

The unitary tests are provided in directory cpp-strings-tests/. File cpp-strings-tests.cpp contains the related code. They has been coded using VS2022 IDE and as such, are using the Microsoft Visual Studio Cpp Unit Test Framework. The related VS project can be found in the same directory. It is already configured to create code for Release as well as for Debug configurations, and for 32-bits or 64-bits platforms at your choice.
+ This .cpp file is a great place to see cpp-strings code in action. Each structure, class, method, litteral operator and function being unitary tested, you should find there many examples of their use for all cpp-strings stuff.

+
+

+Latest Release - Release 1.0 (1.0.0.224) 2025/07

+

The coding of this project started by March 2023 and had been put in standby mode for some months. The very first release is now availble (since July 2025), as Release 1.0.

+

This release has been fully tested. It implements all Python strings API but one feature (see below). Python slices are implemented via c++ operator() as declared and defined in the templated class pcs::CppStringT<>. Python slices have next specific notation: [start : stop : step] and allow the running through range [start, stop) (notice: stop is excluded from the range) step by step. Operator (start, stop, step) acts the same way while running through the content of c++ strings.

+
+ +
+
+
+ + + + diff --git a/cpp-strings/html/index.js b/cpp-strings/html/index.js new file mode 100644 index 0000000..d7dba3d --- /dev/null +++ b/cpp-strings/html/index.js @@ -0,0 +1,6 @@ +var index = +[ + [ "License", "index.html#autotoc_md2", null ], + [ "Intro", "index.html#autotoc_md3", null ], + [ "Latest Release - Release 1.0 (1.0.0.224) 2025/07", "index.html#autotoc_md5", null ] +]; \ No newline at end of file diff --git a/cpp-strings/html/jquery.js b/cpp-strings/html/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/cpp-strings/html/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/cpp-strings/html/menu.js b/cpp-strings/html/menu.js new file mode 100644 index 0000000..15f9c52 --- /dev/null +++ b/cpp-strings/html/menu.js @@ -0,0 +1,131 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
    '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'+ + '
'+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + $('#main-menu').append('
  • '); + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/cpp-strings/html/menudata.js b/cpp-strings/html/menudata.js new file mode 100644 index 0000000..2d950f2 --- /dev/null +++ b/cpp-strings/html/menudata.js @@ -0,0 +1,82 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"i",url:"namespacemembers.html#index_i"}, +{text:"o",url:"namespacemembers.html#index_o"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"t",url:"namespacemembers.html#index_t"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"i",url:"namespacemembers_func.html#index_i"}, +{text:"o",url:"namespacemembers_func.html#index_o"}, +{text:"s",url:"namespacemembers_func.html#index_s"}, +{text:"t",url:"namespacemembers_func.html#index_t"}]}, +{text:"Typedefs",url:"namespacemembers_type.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"j",url:"functions.html#index_j"}, +{text:"l",url:"functions.html#index_l"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"z",url:"functions.html#index_z"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"b",url:"functions_func.html#index_b"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"j",url:"functions_func.html#index_j"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"u",url:"functions_func.html#index_u"}, +{text:"z",url:"functions_func.html#index_z"}, +{text:"~",url:"functions_func.html#index__7E"}]}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/cpp-strings/html/namespacemembers.html b/cpp-strings/html/namespacemembers.html new file mode 100644 index 0000000..e29a627 --- /dev/null +++ b/cpp-strings/html/namespacemembers.html @@ -0,0 +1,159 @@ + + + + + + + +cpp-strings: Namespace Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    cpp-strings 1.0.0 +
    +
    Pythonic c++ strings
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    + +

    - c -

      +
    • CppString : pcs
    • +
    • CppWString : pcs
    • +
    + + +

    - i -

      +
    • is_alpha() : pcs
    • +
    • is_alpha< char >() : pcs
    • +
    • is_alpha< wchar_t >() : pcs
    • +
    • is_ascii() : pcs
    • +
    • is_decimal() : pcs
    • +
    • is_decimal< char >() : pcs
    • +
    • is_decimal< wchar_t >() : pcs
    • +
    • is_digit() : pcs
    • +
    • is_digit< char >() : pcs
    • +
    • is_digit< wchar_t >() : pcs
    • +
    • is_id_continue() : pcs
    • +
    • is_id_start() : pcs
    • +
    • is_lower() : pcs
    • +
    • is_lower< char >() : pcs
    • +
    • is_lower< wchar_t >() : pcs
    • +
    • is_numeric() : pcs
    • +
    • is_numeric< char >() : pcs
    • +
    • is_numeric< wchar_t >() : pcs
    • +
    • is_printable() : pcs
    • +
    • is_printable< char >() : pcs
    • +
    • is_printable< wchar_t >() : pcs
    • +
    • is_punctuation() : pcs
    • +
    • is_punctuation< char >() : pcs
    • +
    • is_punctuation< wchar_t >() : pcs
    • +
    • is_space() : pcs
    • +
    • is_space< char >() : pcs
    • +
    • is_space< wchar_t >() : pcs
    • +
    • is_upper() : pcs
    • +
    • is_upper< char >() : pcs
    • +
    • is_upper< wchar_t >() : pcs
    • +
    + + +

    - o -

      +
    • operator""_cs() : pcs
    • +
    + + +

    - s -

      +
    • swap_case() : pcs
    • +
    + + +

    - t -

      +
    • to_lower() : pcs
    • +
    • to_lower< char >() : pcs
    • +
    • to_lower< wchar_t >() : pcs
    • +
    • to_upper() : pcs
    • +
    • to_upper< char >() : pcs
    • +
    • to_upper< wchar_t >() : pcs
    • +
    +
    +
    +
    + + + + diff --git a/cpp-strings/html/namespacemembers_func.html b/cpp-strings/html/namespacemembers_func.html new file mode 100644 index 0000000..99524ea --- /dev/null +++ b/cpp-strings/html/namespacemembers_func.html @@ -0,0 +1,153 @@ + + + + + + + +cpp-strings: Namespace Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    cpp-strings 1.0.0 +
    +
    Pythonic c++ strings
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace functions with links to the namespaces they belong to:
    + +

    - i -

      +
    • is_alpha() : pcs
    • +
    • is_alpha< char >() : pcs
    • +
    • is_alpha< wchar_t >() : pcs
    • +
    • is_ascii() : pcs
    • +
    • is_decimal() : pcs
    • +
    • is_decimal< char >() : pcs
    • +
    • is_decimal< wchar_t >() : pcs
    • +
    • is_digit() : pcs
    • +
    • is_digit< char >() : pcs
    • +
    • is_digit< wchar_t >() : pcs
    • +
    • is_id_continue() : pcs
    • +
    • is_id_start() : pcs
    • +
    • is_lower() : pcs
    • +
    • is_lower< char >() : pcs
    • +
    • is_lower< wchar_t >() : pcs
    • +
    • is_numeric() : pcs
    • +
    • is_numeric< char >() : pcs
    • +
    • is_numeric< wchar_t >() : pcs
    • +
    • is_printable() : pcs
    • +
    • is_printable< char >() : pcs
    • +
    • is_printable< wchar_t >() : pcs
    • +
    • is_punctuation() : pcs
    • +
    • is_punctuation< char >() : pcs
    • +
    • is_punctuation< wchar_t >() : pcs
    • +
    • is_space() : pcs
    • +
    • is_space< char >() : pcs
    • +
    • is_space< wchar_t >() : pcs
    • +
    • is_upper() : pcs
    • +
    • is_upper< char >() : pcs
    • +
    • is_upper< wchar_t >() : pcs
    • +
    + + +

    - o -

      +
    • operator""_cs() : pcs
    • +
    + + +

    - s -

      +
    • swap_case() : pcs
    • +
    + + +

    - t -

      +
    • to_lower() : pcs
    • +
    • to_lower< char >() : pcs
    • +
    • to_lower< wchar_t >() : pcs
    • +
    • to_upper() : pcs
    • +
    • to_upper< char >() : pcs
    • +
    • to_upper< wchar_t >() : pcs
    • +
    +
    +
    +
    + + + + diff --git a/cpp-strings/html/namespacemembers_type.html b/cpp-strings/html/namespacemembers_type.html new file mode 100644 index 0000000..d66a60f --- /dev/null +++ b/cpp-strings/html/namespacemembers_type.html @@ -0,0 +1,103 @@ + + + + + + + +cpp-strings: Namespace Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    cpp-strings 1.0.0 +
    +
    Pythonic c++ strings
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace typedefs with links to the namespaces they belong to:
      +
    • CppString : pcs
    • +
    • CppWString : pcs
    • +
    +
    +
    +
    + + + + diff --git a/cpp-strings/html/namespacepcs.html b/cpp-strings/html/namespacepcs.html new file mode 100644 index 0000000..c490840 --- /dev/null +++ b/cpp-strings/html/namespacepcs.html @@ -0,0 +1,1493 @@ + + + + + + + +cpp-strings: pcs Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    cpp-strings 1.0.0 +
    +
    Pythonic c++ strings
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    pcs Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + +

    +Classes

    class  CppStringT
     This is the templated base class for all CppString classes. More...
    class  Slice
     Base class for slices, with start, stop and step specified values. More...
    struct  StartSlice
     Base class for slices, with start, stop and step specified values. More...
    struct  StartStepSlice
     struct of slices with default step values More...
    struct  StartStopSlice
     struct of slices with default start and stop values More...
    struct  StepSlice
     struct of slices with default start and step values More...
    struct  StopSlice
     struct of slices with default stop and step values More...
    struct  StopStepSlice
     struct of slices with default stop values More...
    + + + + + +

    +Typedefs

    using CppString = CppStringT<char>
     Specialization of basic class with template argument 'char'.
    using CppWString = CppStringT<wchar_t>
     Specialization of basic class with template argument 'wchar_t'.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    template<class CharT>
    const bool is_alpha (const CharT ch) noexcept
     struct of slices with default start values
    template<>
    const bool is_alpha< char > (const char ch) noexcept
     Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settings.
    template<>
    const bool is_alpha< wchar_t > (const wchar_t ch) noexcept
     Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settings.
    template<class CharT>
    const bool is_ascii (const CharT ch) noexcept
     Returns true if character ch gets ASCII code, or false otherwise.
    template<class CharT>
    const bool is_decimal (const CharT ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<>
    const bool is_decimal< char > (const char ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<>
    const bool is_decimal< wchar_t > (const wchar_t ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<class CharT>
    const bool is_digit (const CharT ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<>
    const bool is_digit< char > (const char ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<>
    const bool is_digit< wchar_t > (const wchar_t ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<class CharT>
    const bool is_id_continue (const CharT ch) noexcept
     Returns true if character is a continuing char for identifiers, or false otherwise.
    template<class CharT>
    const bool is_id_start (const CharT ch) noexcept
     Returns true if character is a starting char for identifiers, or false otherwise.
    template<class CharT>
    const bool is_lower (const CharT ch) noexcept
     Returns true if character is lowercase, or false otherwise.
    template<>
    const bool is_lower< char > (const char ch) noexcept
     Returns true if character ch is lowercase, or false otherwise. Conforms to the current locale settings.
    template<>
    const bool is_lower< wchar_t > (const wchar_t ch) noexcept
     Returns true if character ch is lowercase, or false otherwise. Conforms to the current locale settings.
    template<class CharT>
    const bool is_numeric (const CharT ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<>
    const bool is_numeric< char > (const char ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<>
    const bool is_numeric< wchar_t > (const wchar_t ch) noexcept
     Returns true if character is a decimal digit, or false otherwise.
    template<class CharT>
    const bool is_printable (const CharT ch) noexcept
     Returns true if character ch is printable, or false otherwise.
    template<>
    const bool is_printable< char > (const char ch) noexcept
     Returns true if character ch is printable, or false otherwise.
    template<>
    const bool is_printable< wchar_t > (const wchar_t ch) noexcept
     Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale settings.
    template<class CharT>
    const bool is_punctuation (const CharT ch) noexcept
     Returns true if character ch is punctuation, or false otherwise.
    template<>
    const bool is_punctuation< char > (const char ch) noexcept
     Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale settings.
    template<>
    const bool is_punctuation< wchar_t > (const wchar_t ch) noexcept
     Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale settings.
    template<class CharT>
    const bool is_space (const CharT ch) noexcept
     Returns true if character ch is white space, or false otherwise.
    template<>
    const bool is_space< char > (const char ch) noexcept
     Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settings.
    template<>
    const bool is_space< wchar_t > (const wchar_t ch) noexcept
     Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settings.
    template<class CharT>
    const bool is_upper (const CharT ch) noexcept
     Returns true if character is uppercase, or false otherwise.
    template<>
    const bool is_upper< char > (const char ch) noexcept
     Returns true if character ch is uppercase, or false otherwise. Conforms to the current locale settings.
    template<>
    const bool is_upper< wchar_t > (const wchar_t ch) noexcept
     Returns true if character ch is uppercase, or false otherwise. Conforms to the current locale settings.
    CppString operator""_cs (const char *str, std::size_t len)
     Forms a CppString literal.
    CppWString operator""_cs (const wchar_t *str, std::size_t len)
     Forms a CppWString literal.
    template<class CharT>
    const CharT swap_case (const CharT ch) noexcept
     Returns the swapped case form of character ch if it exists, or ch itself otherwise.
    template<class CharT>
    const CharT to_lower (const CharT ch) noexcept
     Returns the lowercase form of character ch if it exists, or ch itself otherwise.
    template<>
    const char to_lower< char > (const char ch) noexcept
     Returns the lowercase form of character ch if it exists, or ch itself otherwise. Conforms to the current locale settings.
    template<>
    const wchar_t to_lower< wchar_t > (const wchar_t ch) noexcept
     Returns the lowercase form of character ch if it exists, or ch itself otherwise. Conforms to the current locale settings.
    template<class CharT>
    const CharT to_upper (const CharT ch) noexcept
     Returns the uppercase form of character ch if it exists, or ch itself otherwise.
    template<>
    const char to_upper< char > (const char ch) noexcept
     Returns the uppercase form of character ch if it exists, or ch itself otherwise. Conforms to the current locale settings.
    template<>
    const wchar_t to_upper< wchar_t > (const wchar_t ch) noexcept
     Returns the uppercase form of character ch if it exists, or ch itself otherwise. Conforms to the current locale settings.
    +

    Detailed Description

    +

    Library cppstrings "What if c++ strings where as easy to use as Python strings?"

    +

    Copyright (C) 2023-2025 Philippe Schmouker contact - ph (dot) schmouker (at) gmail (dot) com

    +

    This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

    +

    This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

    +

    You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.

    +

    Typedef Documentation

    + +

    ◆ CppString

    + +
    +
    + + + + +
    using pcs::CppString = CppStringT<char>
    +
    + +

    Specialization of basic class with template argument 'char'.

    + +
    +
    + +

    ◆ CppWString

    + +
    +
    + + + + +
    using pcs::CppWString = CppStringT<wchar_t>
    +
    + +

    Specialization of basic class with template argument 'wchar_t'.

    + +
    +
    +

    Function Documentation

    + +

    ◆ is_alpha()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_alpha (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    struct of slices with default start values

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    +

    Returns true if character ch is alphabetic, or false otherwise.

    + +

    References is_alpha().

    + +

    Referenced by is_alpha(), is_id_start(), pcs::CppStringT< char >::isalnum(), and pcs::CppStringT< char >::isalpha().

    + +
    +
    + +

    ◆ is_alpha< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_alpha< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_alpha< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_alpha< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_ascii()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_ascii (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch gets ASCII code, or false otherwise.

    +

    Returns true if character has code point in the range U+0000-U+007F.

    + +

    Referenced by pcs::CppStringT< char >::isascii().

    + +
    +
    + +

    ◆ is_decimal()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_decimal (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    Referenced by is_digit(), is_digit< char >(), is_digit< wchar_t >(), is_id_continue(), is_numeric(), is_numeric< char >(), is_numeric< wchar_t >(), pcs::CppStringT< char >::isalnum(), and pcs::CppStringT< char >::isdecimal().

    + +
    +
    + +

    ◆ is_decimal< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_decimal< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    + +
    +
    + +

    ◆ is_decimal< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_decimal< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    + +
    +
    + +

    ◆ is_digit()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_digit (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    References is_decimal().

    + +

    Referenced by pcs::CppStringT< char >::isalnum().

    + +
    +
    + +

    ◆ is_digit< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_digit< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    + +

    References is_decimal().

    + +
    +
    + +

    ◆ is_digit< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_digit< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    + +

    References is_decimal().

    + +
    +
    + +

    ◆ is_id_continue()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_id_continue (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a continuing char for identifiers, or false otherwise.

    + +

    References is_decimal(), and is_id_start().

    + +

    Referenced by pcs::CppStringT< char >::isidentifier().

    + +
    +
    + +

    ◆ is_id_start()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_id_start (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a starting char for identifiers, or false otherwise.

    + +

    References is_alpha().

    + +

    Referenced by is_id_continue(), and pcs::CppStringT< char >::isidentifier().

    + +
    +
    + +

    ◆ is_lower()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_lower (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is lowercase, or false otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    Referenced by pcs::CppStringT< char >::islower(), and swap_case().

    + +
    +
    + +

    ◆ is_lower< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_lower< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is lowercase, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_lower< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_lower< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is lowercase, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_numeric()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_numeric (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    References is_decimal().

    + +

    Referenced by pcs::CppStringT< char >::isalnum().

    + +
    +
    + +

    ◆ is_numeric< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_numeric< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    + +

    References is_decimal().

    + +
    +
    + +

    ◆ is_numeric< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_numeric< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is a decimal digit, or false otherwise.

    + +

    References is_decimal().

    + +
    +
    + +

    ◆ is_printable()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_printable (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is printable, or false otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    Referenced by pcs::CppStringT< char >::isprintable().

    + +
    +
    + +

    ◆ is_printable< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_printable< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is printable, or false otherwise.

    + +
    +
    + +

    ◆ is_printable< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_printable< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_punctuation()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_punctuation (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is punctuation, or false otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    Referenced by pcs::CppStringT< char >::is_words_sep(), and pcs::CppStringT< char >::ispunctuation().

    + +
    +
    + +

    ◆ is_punctuation< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_punctuation< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_punctuation< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_punctuation< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_space()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_space (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is white space, or false otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    Referenced by pcs::CppStringT< char >::is_words_sep(), and pcs::CppStringT< char >::isspace().

    + +
    +
    + +

    ◆ is_space< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_space< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_space< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_space< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_upper()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_upper (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character is uppercase, or false otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    Referenced by pcs::CppStringT< char >::isupper(), and swap_case().

    + +
    +
    + +

    ◆ is_upper< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_upper< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is uppercase, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ is_upper< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const bool pcs::is_upper< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns true if character ch is uppercase, or false otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ operator""_cs() [1/2]

    + +
    +
    + + + + + +
    + + + + + + + + + + + +
    CppString pcs::operator""_cs (const char * str,
    std::size_t len )
    +
    +inline
    +
    + +

    Forms a CppString literal.

    + +
    +
    + +

    ◆ operator""_cs() [2/2]

    + +
    +
    + + + + + +
    + + + + + + + + + + + +
    CppWString pcs::operator""_cs (const wchar_t * str,
    std::size_t len )
    +
    +inline
    +
    + +

    Forms a CppWString literal.

    + +
    +
    + +

    ◆ swap_case()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const CharT pcs::swap_case (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns the swapped case form of character ch if it exists, or ch itself otherwise.

    + +

    References is_lower(), is_upper(), to_lower(), and to_upper().

    + +

    Referenced by pcs::CppStringT< char >::swapcase().

    + +
    +
    + +

    ◆ to_lower()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const CharT pcs::to_lower (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns the lowercase form of character ch if it exists, or ch itself otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    Referenced by swap_case().

    + +
    +
    + +

    ◆ to_lower< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const char pcs::to_lower< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns the lowercase form of character ch if it exists, or ch itself otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ to_lower< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const wchar_t pcs::to_lower< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns the lowercase form of character ch if it exists, or ch itself otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ to_upper()

    + +
    +
    +
    +template<class CharT>
    + + + + + +
    + + + + + + + +
    const CharT pcs::to_upper (const CharT ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns the uppercase form of character ch if it exists, or ch itself otherwise.

    +

    SHOULD NEVER BE USED. Use next specializations instead.

    + +

    Referenced by pcs::CppStringT< char >::capitalize(), and swap_case().

    + +
    +
    + +

    ◆ to_upper< char >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const char pcs::to_upper< char > (const char ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns the uppercase form of character ch if it exists, or ch itself otherwise. Conforms to the current locale settings.

    + +
    +
    + +

    ◆ to_upper< wchar_t >()

    + +
    +
    +
    +template<>
    + + + + + +
    + + + + + + + +
    const wchar_t pcs::to_upper< wchar_t > (const wchar_t ch)
    +
    +inlinenodiscardnoexcept
    +
    + +

    Returns the uppercase form of character ch if it exists, or ch itself otherwise. Conforms to the current locale settings.

    + +
    +
    +
    +
    + +
    + + + + diff --git a/cpp-strings/html/namespacepcs.js b/cpp-strings/html/namespacepcs.js new file mode 100644 index 0000000..9151eae --- /dev/null +++ b/cpp-strings/html/namespacepcs.js @@ -0,0 +1,52 @@ +var namespacepcs = +[ + [ "CppStringT", "classpcs_1_1_cpp_string_t.html", "classpcs_1_1_cpp_string_t" ], + [ "Slice", "classpcs_1_1_slice.html", "classpcs_1_1_slice" ], + [ "StartSlice", "structpcs_1_1_start_slice.html", "structpcs_1_1_start_slice" ], + [ "StartStepSlice", "structpcs_1_1_start_step_slice.html", "structpcs_1_1_start_step_slice" ], + [ "StartStopSlice", "structpcs_1_1_start_stop_slice.html", "structpcs_1_1_start_stop_slice" ], + [ "StepSlice", "structpcs_1_1_step_slice.html", "structpcs_1_1_step_slice" ], + [ "StopSlice", "structpcs_1_1_stop_slice.html", "structpcs_1_1_stop_slice" ], + [ "StopStepSlice", "structpcs_1_1_stop_step_slice.html", "structpcs_1_1_stop_step_slice" ], + [ "CppString", "namespacepcs.html#a08d21c458d61442667df24212920d0d9", null ], + [ "CppWString", "namespacepcs.html#a79a822cea8e301fd51d2ed51dff57286", null ], + [ "is_alpha", "namespacepcs.html#a40bc3d234e3c737f34d267151ca62014", null ], + [ "is_alpha< char >", "namespacepcs.html#ade5b26313fc856bb882109d6945629b8", null ], + [ "is_alpha< wchar_t >", "namespacepcs.html#a069625790af3ecf05a424c2c53eabfc0", null ], + [ "is_ascii", "namespacepcs.html#ac7822fd0c570f69d597936a24c38ba2a", null ], + [ "is_decimal", "namespacepcs.html#a9f0ba4e85fc273fad1a8b489f3be7fa8", null ], + [ "is_decimal< char >", "namespacepcs.html#a28f77929d599a862403a4471f6b73fc3", null ], + [ "is_decimal< wchar_t >", "namespacepcs.html#a60a2017b25d3d06b83e72f5ed5a93d09", null ], + [ "is_digit", "namespacepcs.html#a52b12f8beb4ab7d8b819ca24180e08d1", null ], + [ "is_digit< char >", "namespacepcs.html#af7c58514e3378a219904f22eb22e9072", null ], + [ "is_digit< wchar_t >", "namespacepcs.html#a01c6093b1a8ef52114f799635ff930d5", null ], + [ "is_id_continue", "namespacepcs.html#aef0240331a343bb1ad13eb613ca93fa4", null ], + [ "is_id_start", "namespacepcs.html#abfda7874fe5b1f72c1c5a9a04d5c7e42", null ], + [ "is_lower", "namespacepcs.html#aedd570e9ffa0572d56fce5085594bdbb", null ], + [ "is_lower< char >", "namespacepcs.html#a29893984c95e53a6efe01f74c2dcc03a", null ], + [ "is_lower< wchar_t >", "namespacepcs.html#ad1d1b13c16ce784055e93af9fa34fb5c", null ], + [ "is_numeric", "namespacepcs.html#af1b60c1081e8bc3b4cd91fbe240e9b87", null ], + [ "is_numeric< char >", "namespacepcs.html#a242e3c28e3d47d19d70ab70d83e74d35", null ], + [ "is_numeric< wchar_t >", "namespacepcs.html#acab7e7bb1ffd6e4ea1a8300b05478647", null ], + [ "is_printable", "namespacepcs.html#a51cd6883557ab31a1e0c8e7b5ab27351", null ], + [ "is_printable< char >", "namespacepcs.html#a1cd19ec212e3ada992a8effb8d5d872d", null ], + [ "is_printable< wchar_t >", "namespacepcs.html#a30ed0cd7942d081369f78a49a029d8b1", null ], + [ "is_punctuation", "namespacepcs.html#a02d340dd9c510eda0fbfed07a08d0792", null ], + [ "is_punctuation< char >", "namespacepcs.html#aa36d34c2227cde5856e8d61fa6e4af58", null ], + [ "is_punctuation< wchar_t >", "namespacepcs.html#a363e2bac9c403a623c5a410f7113edd3", null ], + [ "is_space", "namespacepcs.html#af089ceadbeaab27e12ad7f7edaaec72a", null ], + [ "is_space< char >", "namespacepcs.html#a714cfa835ef4db5180309829ee8e27a9", null ], + [ "is_space< wchar_t >", "namespacepcs.html#a57a765c6eb624107a2176a56cf2220a7", null ], + [ "is_upper", "namespacepcs.html#a8cb1cd0a1e39d92893eb7d22145f5d65", null ], + [ "is_upper< char >", "namespacepcs.html#ac25d471fa1d838401335776ad4b6ead1", null ], + [ "is_upper< wchar_t >", "namespacepcs.html#ab5077443809e9e4eb7bfa463728f398a", null ], + [ "operator\"\"_cs", "namespacepcs.html#afb8dd890fe893aba3264ac7df4fe7124", null ], + [ "operator\"\"_cs", "namespacepcs.html#acb7395de8ef88696d0c8c9772e172118", null ], + [ "swap_case", "namespacepcs.html#ac6e0b881e35c04e9b5bbe6e8b17ee1a7", null ], + [ "to_lower", "namespacepcs.html#a965f285db4253ce86ed59fccc2e8be61", null ], + [ "to_lower< char >", "namespacepcs.html#a4c4164fedd9cb659873a980fa855f4a2", null ], + [ "to_lower< wchar_t >", "namespacepcs.html#ab097a99126055ab4c843eb6efb573bb1", null ], + [ "to_upper", "namespacepcs.html#a607c82cc94f2b6473d8391334eed8c14", null ], + [ "to_upper< char >", "namespacepcs.html#ab823c7be920affd05f96a6ad8b99accf", null ], + [ "to_upper< wchar_t >", "namespacepcs.html#aaf8dcc64819cbf8631fc63e0dd522811", null ] +]; \ No newline at end of file diff --git a/cpp-strings/html/namespaces.html b/cpp-strings/html/namespaces.html new file mode 100644 index 0000000..9d8281c --- /dev/null +++ b/cpp-strings/html/namespaces.html @@ -0,0 +1,107 @@ + + + + + + + +cpp-strings: Namespace List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    cpp-strings 1.0.0 +
    +
    Pythonic c++ strings
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Namespace List
    +
    +
    +
    Here is a list of all documented namespaces with brief descriptions:
    + + +
     Npcs
    +
    +
    +
    +
    + + + + diff --git a/cpp-strings/html/namespaces_dup.js b/cpp-strings/html/namespaces_dup.js new file mode 100644 index 0000000..2c93f11 --- /dev/null +++ b/cpp-strings/html/namespaces_dup.js @@ -0,0 +1,4 @@ +var namespaces_dup = +[ + [ "pcs", "namespacepcs.html", "namespacepcs" ] +]; \ No newline at end of file diff --git a/cpp-strings/html/navtree.css b/cpp-strings/html/navtree.css new file mode 100644 index 0000000..0ea3a07 --- /dev/null +++ b/cpp-strings/html/navtree.css @@ -0,0 +1,327 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0; + padding:0; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); + line-height: 22px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--page-link-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; +} + +#nav-sync { + position:absolute; + top:0px; + right:0px; + z-index:1; +} + +#nav-sync img { + opacity:0.3; +} + +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/cpp-strings/html/navtree.js b/cpp-strings/html/navtree.js new file mode 100644 index 0000000..4fcf6e3 --- /dev/null +++ b/cpp-strings/html/navtree.js @@ -0,0 +1,899 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath,allMembersFile) { + let navTreeSubIndices = []; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function getScrollBarWidth () { + let outer = $('
    ').css({visibility: 'hidden', width: 100, overflow: 'scroll', scrollbarWidth: 'thin'}).appendTo('body'); + let widthWithScroll = $('
    ').css({width: '100%'}).appendTo(outer).outerWidth(); + outer.remove(); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + $("#nav-sync").css({right:parseInt(hasVerticalScrollbar?scrollbarWidth:0)}); + } + } + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + const e = n.replace(/-/g,'_'); + return window[e]; + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = function() { func(); adjustSyncIconPosition(); } + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).removeClass('opened').addClass('closed'); + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.offset().top; + } else if (anchor.position()) { + pos = anchor.offset().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(htmlToNode(''+text+'')); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).addClass('opened').removeClass('closed'); + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + $(node.plus_img.childNodes[0]).removeClass('closed').addClass('opened'); + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = $.extend(true, [], nti); + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } + } + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const navTo = function(o,root,hash,relpath) { + const link = cachedLink(); + if (link) { + const parts = link.split('#'); + root = parts[0]; + hash = parts.length>1 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + gotoUrl(o,root,hash,relpath); + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav.length ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseInt(widths.leftPanelWidth)+"px"; + content.css({marginLeft:widthStr}); + if (fullSidebar) { + footer.css({marginLeft:widthStr}); + if (mainnav) { + mainnav.css({marginLeft:widthStr}); + } + } + sidenav.css({width:widthStr}); + if (pagenav.length) { + container.css({gridTemplateColumns:'auto '+parseInt(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseInt(widths.rightPanelWidth-1)+'px'}); + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = $(sidenav).outerWidth()-barWidth; + const pagenavWidth = pagenav.length ? $(pagenav).outerWidth() : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav.length) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.outerHeight(); + } + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + content.css({height:contentHeight + "px"}); + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(true); } }); + $(sidenav).resizable({ minWidth: 0 }); + if (pagenav.length) { + pagehandle = $("#page-nav-resize-handle"); + pagehandle.on('mousedown touchstart',function(e) { + $('body').addClass('resizing'); + pagehandle.addClass('dragging'); + $(document).on('mousemove touchmove',function(e) { + const clientX = e.clientX || e.originalEvent.touches[0].clientX; + let pagenavWidth = container[0].offsetWidth-clientX+barWidth/2; + const sidenavWidth = sidenav.width(); + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.css({gridTemplateColumns:'auto '+parseInt(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseInt(widths.rightPanelWidth-1)+'px'}); + content.css({marginLeft:parseInt(widths.leftPanelWidth)+'px'}); + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }); + $(document).on('mouseup touchend', function(e) { + $('body').removeClass('resizing'); + pagehandle.removeClass('dragging'); + $(document).off('mousemove mouseup touchmove touchend'); + }); + }); + } else { + container.css({gridTemplateColumns:'auto'}); + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(window).ready(function() { + let lastWidth = -1; + let lastHeight = -1; + $(window).resize(function() { + const newWidth = $(this).width(), newHeight = $(this).height(); + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = $(window).width(); + lastHeight = $(window).height(); + content.scroll(function() { + navtree_trampoline.updateContentTop(); + }); + }); + } + + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content=$('

    If you want to run the unitary tests, well, use the last version of Visual Studio (i.e. VS 2022, by July 2025). The Community free version will truly be fine.
    The vcproject associated with the unit tests in cpp-strings is already configured to use the option flag /std:c++latest since the implemented code uses a very few but very useful c++23 goodies.

    +

    github repository: https://github.com/schmouk/pythonic-cpp-strings
    + pythonic-cpp-strings github web pages: https://schmouk.github.io/pythonic-cpp-strings/


    -

    +

    License

    Library cpp-strings
     "What if c++ strings where as easy to use as Python strings?"
    @@ -137,23 +141,40 @@ 

    You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.


    -

    +

    Intro

    The creation of this library has been started with the aim at easing the use of strings in c++. Other projects exist, even aiming also to implement a Python-like strings API, but the only ones we have found were either started but not completed, or were not implementing the whole Python API.

    So, we started to work on Pythonic c++ strings. Library cpp-strings is now ready. It fully implements the Python API (even with a c++ implementation of slices) and it is fully tested with unitary tests.

    The implementation of library cpp-strings is fully templated and is contained into a single header file: cpp-strings/cppstrings.h. To take a whole benefit of it, just add this header file to your project and include it in your own files. It very fastly compiles. That's all!

    Header file cpp-strings/cppstrings.h defines:

    • templated class template<typename CharT> class pcs::CppStringT which implements all the stuff about pythonic c++ strings. It inherits from c++ STL class std::basic_string<CharT>, so it gets access to all c++ STL methods, functions and goodies about strings;
    • -
    • this class is specialized by using pcs::CppString> = pcs::CppStringT<char> for pythonic c++ strings based on char characters;
    • -
    • it is also specialized by using pcs::CppWString> = pcs::CppStringT<wchar_t> for pythonic c++ strings based on wchar_t characters.
    • +
    • this class is specialized by: using pcs::CppString> = pcs::CppStringT<char> for pythonic c++ strings based on char characters;
    • +
    • it is also specialized by: using pcs::CppWString> = pcs::CppStringT<wchar_t> for pythonic c++ strings based on wchar_t characters.
    -

    The unitary tests are provided in directory cpp-strings-tests/. File cpp-strings-tests.cpp contains the related code. They has been coded using VS2022 IDE and as such, are using the Microsoft Visual Studio Cpp Unit Test Framework. The related VS project can be found in the same directory. It is already configured to create code for Release as well as for Debug configurations, and for 32-bits or 64-bits platforms at your choice.
    - This .cpp file is a great place to see cpp-strings code in action. Each structure, class, method, litteral operator and function being unitary tested, you should find there many examples of their use for all cpp-strings stuff.

    +

    The unitary tests are provided in directory cpp-strings-tests/. File cpp-strings-tests/cpp-strings-tests.cpp contains the related code. Tests have been coded using VS2022 IDE and as such, are using the Microsoft Visual Studio Cpp Unit Test Framework. The related VS project can be found in the same directory. It is already configured to create code for Release as well as for Debug configurations, and for 32-bits or 64-bits platforms at your choice.
    + This .cpp file is a great place to see cpp-strings code in action. Each structure, class, method, litteral operator and function being unitary tested in here, you should find there many examples of its use for all cpp-strings stuff.

    +
    +

    +Latest Release - Release 1.0 (1.0.0.229) 2025/07

    +

    The coding of this project started by March 2023 and had been put in standby mode for some months - no time to work on it. The very first release is now availble (since July 2025), as Release 1.0.

    +

    This release has been fully tested. Code coverage is 100%.

    +

    Release 1.0 implements all Python strings API but one feature (see below).

    +

    Python slices are implemented via c++ operator() as declared and defined in the templated class pcs::CppStringT<>. Python slices have next specific notation: [start : stop : step] and allow the running step by step through range [start, stop) (notice: stop is excluded from the range). Operator (start, stop, step) acts the same way while running through the content of pythonic c++ strings. A dedicated base class Slice is also provided and can be passed as argument to operator(). It is derived in many simpler slices classes, since Python slices may not define either start, stop or step which then get default values (resp. 0, end-of-sequence, and 1).

    +

    +Missing parts in Release 1.0

    +

    Python strings are based on Unicode chars. This is currently not the case for pythonic c++ strings in cpp-strings.
    + Unicode encoding allows for a specific comparison mode on strings, the casefold mode. There, Unicode chars are transformed into their lower equivalent char in a standardized manner which is more "agressive" than the simpler lowering method lower(). Comparing strings without taking into account the case of their chars is then performed in a far more accurate manner.
    + This feature is currently NOT implemented in library cpp-strings.

    +

    So up to now, if you want to compare pythonic c++ strings from cpp-strings on whatever the case is for each of their chars, compare them applying method .lower() to both strings. This will do the job for chars and for wchar_t also for a majority of languages (but might fail for very few signs of specific languages in this last case).

    +

    Notice: dealing with Unicode chars and implementing method casefold() as it is the case in Python is planned for a next release of library cpp-strings.
    + N.B. "*planned for a next release*" does not imply that a fixed date is planned either.


    -

    -Latest Release - Release 1.0 (1.0.0.224) 2025/07

    -

    The coding of this project started by March 2023 and had been put in standby mode for some months. The very first release is now availble (since July 2025), as Release 1.0.

    -

    This release has been fully tested. It implements all Python strings API but one feature (see below). Python slices are implemented via c++ operator() as declared and defined in the templated class pcs::CppStringT<>. Python slices have next specific notation: [start : stop : step] and allow the running through range [start, stop) (notice: stop is excluded from the range) step by step. Operator (start, stop, step) acts the same way while running through the content of c++ strings.

    +

    +Documentation

    +

    The cpp-strings HTML documentation is available here: html/index.html.

    +

    It has then been produced with the great utility doxygen developed by Vicente Hernando (the doxygen Github repository can be accessed here, and the utility can be downloaded from there: https://www.doxygen.nl/download.html).

    +

    This is a short documentation of the library. For some of its part it is a copy of the Python original documentation on strings. For its other part it documents the c++ implementation of cpp-strings.

    +

    And remember: to better understand how to use this pythonic c++ strings library, have a look also at cpp-strings-tests/cpp-strings-tests.cpp to see cpp-strings library code in action!

    diff --git a/cpp-strings/html/index.js b/cpp-strings/html/index.js index d7dba3d..c46f603 100644 --- a/cpp-strings/html/index.js +++ b/cpp-strings/html/index.js @@ -1,6 +1,10 @@ var index = [ - [ "License", "index.html#autotoc_md2", null ], - [ "Intro", "index.html#autotoc_md3", null ], - [ "Latest Release - Release 1.0 (1.0.0.224) 2025/07", "index.html#autotoc_md5", null ] + [ "License", "index.html#autotoc_md3", null ], + [ "Intro", "index.html#autotoc_md4", null ], + [ "Latest Release - Release 1.0 (1.0.0.229) 2025/07", "index.html#autotoc_md6", [ + [ "What if c++ strings where as easy to use as Python strings?", "index.html#autotoc_md1", null ], + [ "Missing parts in Release 1.0", "index.html#autotoc_md7", null ] + ] ], + [ "Documentation", "index.html#autotoc_md9", null ] ]; \ No newline at end of file diff --git a/cpp-strings/html/navtreedata.js b/cpp-strings/html/navtreedata.js index 60ee4da..81b2279 100644 --- a/cpp-strings/html/navtreedata.js +++ b/cpp-strings/html/navtreedata.js @@ -25,7 +25,7 @@ var NAVTREE = [ [ "cpp-strings", "index.html", [ - [ "Library cpp-string", "index.html", "index" ], + [ "Library cpp-strings", "index.html", "index" ], [ "Namespaces", "namespaces.html", [ [ "Namespace List", "namespaces.html", "namespaces_dup" ], [ "Namespace Members", "namespacemembers.html", [ diff --git a/cpp-strings/html/navtreeindex1.js b/cpp-strings/html/navtreeindex1.js index 2636c94..28cf466 100644 --- a/cpp-strings/html/navtreeindex1.js +++ b/cpp-strings/html/navtreeindex1.js @@ -13,9 +13,12 @@ var NAVTREEINDEX1 = "hierarchy.html":[2,2], "index.html":[], "index.html":[0], -"index.html#autotoc_md2":[0,0], -"index.html#autotoc_md3":[0,1], -"index.html#autotoc_md5":[0,2], +"index.html#autotoc_md1":[0], +"index.html#autotoc_md3":[0,0], +"index.html#autotoc_md4":[0,1], +"index.html#autotoc_md6":[0,2], +"index.html#autotoc_md7":[0,2,1], +"index.html#autotoc_md9":[0,3], "namespacemembers.html":[1,1,0], "namespacemembers_func.html":[1,1,1], "namespacemembers_type.html":[1,1,2], diff --git a/cpp-strings/html/search/all_0.js b/cpp-strings/html/search/all_0.js index 99af3b7..7610c45 100644 --- a/cpp-strings/html/search/all_0.js +++ b/cpp-strings/html/search/all_0.js @@ -1,7 +1,8 @@ var searchData= [ - ['0_200_20224_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['0_201_200_200_20224_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['0_20224_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['07_3',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]] + ['0_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['0_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['0_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['0_20229_202025_2007_3',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['07_4',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] ]; diff --git a/cpp-strings/html/search/all_1.js b/cpp-strings/html/search/all_1.js index 62e1d20..e34236a 100644 --- a/cpp-strings/html/search/all_1.js +++ b/cpp-strings/html/search/all_1.js @@ -1,5 +1,6 @@ var searchData= [ - ['1_200_200_20224_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['1_200_201_200_200_20224_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]] + ['1_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['1_200_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['1_200_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] ]; diff --git a/cpp-strings/html/search/all_10.js b/cpp-strings/html/search/all_10.js index e86110a..3a8b493 100644 --- a/cpp-strings/html/search/all_10.js +++ b/cpp-strings/html/search/all_10.js @@ -1,12 +1,7 @@ var searchData= [ - ['title_0',['title',['../classpcs_1_1_cpp_string_t.html#a179634aafb049e8604ca78f813684a28',1,'pcs::CppStringT']]], - ['to_5flower_1',['to_lower',['../namespacepcs.html#a965f285db4253ce86ed59fccc2e8be61',1,'pcs']]], - ['to_5flower_3c_20char_20_3e_2',['to_lower< char >',['../namespacepcs.html#a4c4164fedd9cb659873a980fa855f4a2',1,'pcs']]], - ['to_5flower_3c_20wchar_5ft_20_3e_3',['to_lower< wchar_t >',['../namespacepcs.html#ab097a99126055ab4c843eb6efb573bb1',1,'pcs']]], - ['to_5fupper_4',['to_upper',['../namespacepcs.html#a607c82cc94f2b6473d8391334eed8c14',1,'pcs']]], - ['to_5fupper_3c_20char_20_3e_5',['to_upper< char >',['../namespacepcs.html#ab823c7be920affd05f96a6ad8b99accf',1,'pcs']]], - ['to_5fupper_3c_20wchar_5ft_20_3e_6',['to_upper< wchar_t >',['../namespacepcs.html#aaf8dcc64819cbf8631fc63e0dd522811',1,'pcs']]], - ['translate_7',['translate',['../classpcs_1_1_cpp_string_t.html#a2a8c1e78b93da9a0abe471c7a8d85090',1,'pcs::CppStringT']]], - ['transtable_8',['TransTable',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html',1,'pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1fea49a165ebb7cda36c1bfdcbe95ee0',1,'pcs::CppStringT::TransTable::TransTable(const std::map< key_type, value_type > trans_table)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a5efa34c2e8b016458388693a7ab8f590',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const CppStringT &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa99c6a9fafac1361cd8a0fc4578fa084',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const CppStringT &values, const CppStringT &not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aae6cedd7e9c8409e76787c910476813e',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#abf0efc2e493b5c0347327b7c1f175ed8',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > values, const CppStringT &not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a9d7651fe71544575150ebc08022cb885',1,'pcs::CppStringT::TransTable::TransTable(const CharT *keys, const CharT *values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a78d8ac95a740d405c761c73166c9b787',1,'pcs::CppStringT::TransTable::TransTable(const CharT *keys, const CharT *values, const CharT *not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a551b96c6c0ab2bf9183de0bfcc6770a2',1,'pcs::CppStringT::TransTable::TransTable(KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1c10bb78e74942f88247cde65a03d557',1,'pcs::CppStringT::TransTable::TransTable(Key1It first_key, Key1It last_key, ValueIt first_value, ValueIt last_value, Key2It first_not_translated, Key2It last_not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a21791e46266edb8eea13876559b352a2',1,'pcs::CppStringT::TransTable::TransTable(const StringViewLike &keys, const StringViewLike &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a7da38829b171a7a9147b43086e067454',1,'pcs::CppStringT::TransTable::TransTable() noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a69a3ab2775d7e6537528a3eba3c4134a',1,'pcs::CppStringT::TransTable::TransTable(const TransTable &) noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa9182c3323cdba7f6dd30bfa56ebb8fe',1,'pcs::CppStringT::TransTable::TransTable(TransTable &&) noexcept=default']]] + ['partition_0',['partition',['../classpcs_1_1_cpp_string_t.html#ac5f88b0fc1f33cda23c30cb1f3bc560f',1,'pcs::CppStringT']]], + ['parts_20in_20release_201_200_1',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['pcs_2',['pcs',['../namespacepcs.html',1,'']]], + ['python_20strings_3',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] ]; diff --git a/cpp-strings/html/search/all_11.js b/cpp-strings/html/search/all_11.js index f09eceb..9896b90 100644 --- a/cpp-strings/html/search/all_11.js +++ b/cpp-strings/html/search/all_11.js @@ -1,4 +1,17 @@ var searchData= [ - ['upper_0',['upper',['../classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120',1,'pcs::CppStringT::upper() noexcept'],['../classpcs_1_1_cpp_string_t.html#af5ff8cdba1d90516915e20f93567a9a9',1,'pcs::CppStringT::upper(const value_type ch) noexcept']]] + ['release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['release_201_200_201_200_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['release_20release_201_200_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['removeprefix_3',['removeprefix',['../classpcs_1_1_cpp_string_t.html#a058704b7f4538ec9e1798c5348d37c7a',1,'pcs::CppStringT']]], + ['removesuffix_4',['removesuffix',['../classpcs_1_1_cpp_string_t.html#ad6a8dc124ab8b7cab1cb328240763ed0',1,'pcs::CppStringT']]], + ['replace_5',['replace',['../classpcs_1_1_cpp_string_t.html#ad4f39683db649aa8a65907268c499f02',1,'pcs::CppStringT']]], + ['rfind_6',['rfind',['../classpcs_1_1_cpp_string_t.html#af363308ba741b267641e1aa35669d603',1,'pcs::CppStringT::rfind(const CppStringT &sub, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a9f43f20029596abc1362d1242e68e5db',1,'pcs::CppStringT::rfind(const CppStringT &sub, const size_type start) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ac00bb6f7d74bfdde0d4cc247e78ab20e',1,'pcs::CppStringT::rfind(const CppStringT &sub) const noexcept']]], + ['rfind_5fn_7',['rfind_n',['../classpcs_1_1_cpp_string_t.html#a519a292eb3f0790d54a59a201f2d6410',1,'pcs::CppStringT::rfind_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a790f663f51dfe6e9e15d4f5f025bf107',1,'pcs::CppStringT::rfind_n(const CppStringT &sub, const size_type count) const noexcept']]], + ['rindex_8',['rindex',['../classpcs_1_1_cpp_string_t.html#a6693ec49258c6ac80a7875b3ebf3c916',1,'pcs::CppStringT::rindex(const CppStringT &sub, const size_type start, const size_type end) const'],['../classpcs_1_1_cpp_string_t.html#a2baca0ddff848de56a7b867f68d3efab',1,'pcs::CppStringT::rindex(const CppStringT &sub, const size_type start) const'],['../classpcs_1_1_cpp_string_t.html#a546105cc9a8a9d493979c30607092cf1',1,'pcs::CppStringT::rindex(const CppStringT &sub) const']]], + ['rindex_5fn_9',['rindex_n',['../classpcs_1_1_cpp_string_t.html#afc08a4e91b93710838c8f0d6234e057e',1,'pcs::CppStringT::rindex_n(const CppStringT &sub, const size_type start, const size_type count) const'],['../classpcs_1_1_cpp_string_t.html#ac3079cbecbdf4151e66f602f39ece836',1,'pcs::CppStringT::rindex_n(const CppStringT &sub, const size_type count) const']]], + ['rjust_10',['rjust',['../classpcs_1_1_cpp_string_t.html#a61fd4215938ec9f0fce1f885d6bb4a2b',1,'pcs::CppStringT']]], + ['rpartition_11',['rpartition',['../classpcs_1_1_cpp_string_t.html#a61674ee4e97038d82ea7ecc30b1761f6',1,'pcs::CppStringT']]], + ['rsplit_12',['rsplit',['../classpcs_1_1_cpp_string_t.html#a8111cd357773d304fbb496571d7ee6be',1,'pcs::CppStringT::rsplit() noexcept'],['../classpcs_1_1_cpp_string_t.html#a0419f46de6fa532372f3b97b4927ebab',1,'pcs::CppStringT::rsplit(const CppStringT &sep) noexcept'],['../classpcs_1_1_cpp_string_t.html#a3aa66706e268bd570a0084d70dff5cde',1,'pcs::CppStringT::rsplit(const size_type maxsplit) noexcept'],['../classpcs_1_1_cpp_string_t.html#ab0ace502f0b3026fefd2942a1e8a0456',1,'pcs::CppStringT::rsplit(const CppStringT &sep, const size_type maxsplit) noexcept']]], + ['rstrip_13',['rstrip',['../classpcs_1_1_cpp_string_t.html#a89e850d45d6dec167e763cf748a06971',1,'pcs::CppStringT::rstrip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a86f8c78b2eeb3541fb6b56b4f4ac237b',1,'pcs::CppStringT::rstrip() const noexcept']]] ]; diff --git a/cpp-strings/html/search/all_12.js b/cpp-strings/html/search/all_12.js index 09848bb..5928f61 100644 --- a/cpp-strings/html/search/all_12.js +++ b/cpp-strings/html/search/all_12.js @@ -1,4 +1,23 @@ var searchData= [ - ['zfill_0',['zfill',['../classpcs_1_1_cpp_string_t.html#ad3d2b94f37325096205e399b95e9fc5d',1,'pcs::CppStringT']]] + ['slice_0',['Slice',['../classpcs_1_1_slice.html',1,'pcs::Slice< IntT >'],['../classpcs_1_1_slice.html#ab51c3b03351e495729545f2fdaebb888',1,'pcs::Slice::Slice()']]], + ['split_1',['split',['../classpcs_1_1_cpp_string_t.html#a7ca47096b03baa0091c3b0349d210931',1,'pcs::CppStringT::split() noexcept'],['../classpcs_1_1_cpp_string_t.html#acf4d923cfed55cfd90cf12651ce0ac3d',1,'pcs::CppStringT::split(const CppStringT &sep) noexcept'],['../classpcs_1_1_cpp_string_t.html#a8fa2afe84d7fc26f96bbd55f4266df2a',1,'pcs::CppStringT::split(const size_type maxsplit) noexcept'],['../classpcs_1_1_cpp_string_t.html#a55a3fa32de834f644ac28d7c2495fa77',1,'pcs::CppStringT::split(const CppStringT &sep, const size_type maxsplit) noexcept']]], + ['splitlines_2',['splitlines',['../classpcs_1_1_cpp_string_t.html#a0bd53df14569c307b5ca50a2e1e62960',1,'pcs::CppStringT']]], + ['start_3',['start',['../classpcs_1_1_slice.html#a5280a9d6974217c94de5d9027e10d4e1',1,'pcs::Slice']]], + ['startslice_4',['StartSlice',['../structpcs_1_1_start_slice.html',1,'pcs::StartSlice< IntT >'],['../structpcs_1_1_start_slice.html#ae435a090e0d93fe221cab4822e352886',1,'pcs::StartSlice::StartSlice()']]], + ['startstepslice_5',['StartStepSlice',['../structpcs_1_1_start_step_slice.html',1,'pcs::StartStepSlice< IntT >'],['../structpcs_1_1_start_step_slice.html#a438eef8b248cc00ed48afda08aff6d4c',1,'pcs::StartStepSlice::StartStepSlice()']]], + ['startstopslice_6',['StartStopSlice',['../structpcs_1_1_start_stop_slice.html',1,'pcs::StartStopSlice< IntT >'],['../structpcs_1_1_start_stop_slice.html#a7c8ad9cb9d63fb9d56b3dbc9647297b4',1,'pcs::StartStopSlice::StartStopSlice()']]], + ['startswith_7',['startswith',['../classpcs_1_1_cpp_string_t.html#a5a131c385a01ccc5410d4cffa55cf700',1,'pcs::CppStringT::startswith(const CppStringT &prefix, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ad2cfcc7bd22736ebd9f91f04e6a42f8c',1,'pcs::CppStringT::startswith(const CppStringT &prefix, const size_type start) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ae2f755ae7903586a2086b7b7f943d96e',1,'pcs::CppStringT::startswith(const CppStringT &prefix) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a326eb96e19c3559a84af86ff1bf54aa4',1,'pcs::CppStringT::startswith(const std::initializer_list< CppStringT > &prefixes, const size_type start, const size_type end) const noexcept']]], + ['startswith_5fn_8',['startswith_n',['../classpcs_1_1_cpp_string_t.html#a3b7955f9c7f9452a6a025caaaf0e6d73',1,'pcs::CppStringT::startswith_n(const CppStringT &prefix, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ae0865e2c7f8a4871804bf71c1c982dc6',1,'pcs::CppStringT::startswith_n(const CppStringT &prefix, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ab2b293c5f1b55af52ceb75b8f7e4d42e',1,'pcs::CppStringT::startswith_n(const std::initializer_list< CppStringT > &prefix, const size_type start, const size_type count) const noexcept']]], + ['step_9',['step',['../classpcs_1_1_slice.html#a55f046a5343a6ea1bbff8686d2e72d78',1,'pcs::Slice']]], + ['stepslice_10',['StepSlice',['../structpcs_1_1_step_slice.html',1,'pcs::StepSlice< IntT >'],['../structpcs_1_1_step_slice.html#ad24accb58329f71457fbaf00fbbbf874',1,'pcs::StepSlice::StepSlice()']]], + ['stop_11',['stop',['../classpcs_1_1_slice.html#a0fed0ac66885187eb64d1982e0461916',1,'pcs::Slice']]], + ['stopslice_12',['StopSlice',['../structpcs_1_1_stop_slice.html',1,'pcs::StopSlice< IntT >'],['../structpcs_1_1_stop_slice.html#a9d59c11b1bc398b71abc59b4071da379',1,'pcs::StopSlice::StopSlice()']]], + ['stopstepslice_13',['StopStepSlice',['../structpcs_1_1_stop_step_slice.html',1,'pcs::StopStepSlice< IntT >'],['../structpcs_1_1_stop_step_slice.html#a86288ad6b535b8b4d522e8173511c639',1,'pcs::StopStepSlice::StopStepSlice()']]], + ['strings_14',['strings',['../index.html',1,'Library cpp-strings'],['../index.html#autotoc_md1',1,'What if c++ strings where as easy to use as Python strings?']]], + ['strings_20where_20as_20easy_20to_20use_20as_20python_20strings_15',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['strip_16',['strip',['../classpcs_1_1_cpp_string_t.html#a02919129cdf158e75eae1e9815a071bf',1,'pcs::CppStringT::strip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a12bc043347f555b4701e0c70d972058d',1,'pcs::CppStringT::strip() const noexcept']]], + ['substr_17',['substr',['../classpcs_1_1_cpp_string_t.html#a9debc70420a3fbc7722e3111aeccd819',1,'pcs::CppStringT']]], + ['swap_5fcase_18',['swap_case',['../namespacepcs.html#ac6e0b881e35c04e9b5bbe6e8b17ee1a7',1,'pcs']]], + ['swapcase_19',['swapcase',['../classpcs_1_1_cpp_string_t.html#a6ab02b4d1c8093a5dfc089a45427f63c',1,'pcs::CppStringT']]] ]; diff --git a/cpp-strings/html/search/all_13.js b/cpp-strings/html/search/all_13.js index d67d134..46d2dc7 100644 --- a/cpp-strings/html/search/all_13.js +++ b/cpp-strings/html/search/all_13.js @@ -1,11 +1,13 @@ var searchData= [ - ['_7eslice_0',['~Slice',['../classpcs_1_1_slice.html#abdb6694913ed37cf4efc5d85e990c7b5',1,'pcs::Slice']]], - ['_7estartslice_1',['~StartSlice',['../structpcs_1_1_start_slice.html#a6f792a61218b7598f8f6bb37dcdae56e',1,'pcs::StartSlice']]], - ['_7estartstepslice_2',['~StartStepSlice',['../structpcs_1_1_start_step_slice.html#adc0aae8a3849379742e23c4f3a3197a9',1,'pcs::StartStepSlice']]], - ['_7estartstopslice_3',['~StartStopSlice',['../structpcs_1_1_start_stop_slice.html#a95df964c79860a475a63da3e56301ea7',1,'pcs::StartStopSlice']]], - ['_7estepslice_4',['~StepSlice',['../structpcs_1_1_step_slice.html#a93892e4d8f153a06a65e0cd13ebfa949',1,'pcs::StepSlice']]], - ['_7estopslice_5',['~StopSlice',['../structpcs_1_1_stop_slice.html#a6e7e761a846ec00b1f24be9f83830f25',1,'pcs::StopSlice']]], - ['_7estopstepslice_6',['~StopStepSlice',['../structpcs_1_1_stop_step_slice.html#aa62d3d31f646766a6ea2ef3cd9f91491',1,'pcs::StopStepSlice']]], - ['_7etranstable_7',['~TransTable',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#abbbcd9cf0c3ac0a364864f734363dd4c',1,'pcs::CppStringT::TransTable']]] + ['title_0',['title',['../classpcs_1_1_cpp_string_t.html#a179634aafb049e8604ca78f813684a28',1,'pcs::CppStringT']]], + ['to_20use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['to_5flower_2',['to_lower',['../namespacepcs.html#a965f285db4253ce86ed59fccc2e8be61',1,'pcs']]], + ['to_5flower_3c_20char_20_3e_3',['to_lower< char >',['../namespacepcs.html#a4c4164fedd9cb659873a980fa855f4a2',1,'pcs']]], + ['to_5flower_3c_20wchar_5ft_20_3e_4',['to_lower< wchar_t >',['../namespacepcs.html#ab097a99126055ab4c843eb6efb573bb1',1,'pcs']]], + ['to_5fupper_5',['to_upper',['../namespacepcs.html#a607c82cc94f2b6473d8391334eed8c14',1,'pcs']]], + ['to_5fupper_3c_20char_20_3e_6',['to_upper< char >',['../namespacepcs.html#ab823c7be920affd05f96a6ad8b99accf',1,'pcs']]], + ['to_5fupper_3c_20wchar_5ft_20_3e_7',['to_upper< wchar_t >',['../namespacepcs.html#aaf8dcc64819cbf8631fc63e0dd522811',1,'pcs']]], + ['translate_8',['translate',['../classpcs_1_1_cpp_string_t.html#a2a8c1e78b93da9a0abe471c7a8d85090',1,'pcs::CppStringT']]], + ['transtable_9',['TransTable',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html',1,'pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1fea49a165ebb7cda36c1bfdcbe95ee0',1,'pcs::CppStringT::TransTable::TransTable(const std::map< key_type, value_type > trans_table)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a5efa34c2e8b016458388693a7ab8f590',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const CppStringT &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa99c6a9fafac1361cd8a0fc4578fa084',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const CppStringT &values, const CppStringT &not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aae6cedd7e9c8409e76787c910476813e',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#abf0efc2e493b5c0347327b7c1f175ed8',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > values, const CppStringT &not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a9d7651fe71544575150ebc08022cb885',1,'pcs::CppStringT::TransTable::TransTable(const CharT *keys, const CharT *values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a78d8ac95a740d405c761c73166c9b787',1,'pcs::CppStringT::TransTable::TransTable(const CharT *keys, const CharT *values, const CharT *not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a551b96c6c0ab2bf9183de0bfcc6770a2',1,'pcs::CppStringT::TransTable::TransTable(KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1c10bb78e74942f88247cde65a03d557',1,'pcs::CppStringT::TransTable::TransTable(Key1It first_key, Key1It last_key, ValueIt first_value, ValueIt last_value, Key2It first_not_translated, Key2It last_not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a21791e46266edb8eea13876559b352a2',1,'pcs::CppStringT::TransTable::TransTable(const StringViewLike &keys, const StringViewLike &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a7da38829b171a7a9147b43086e067454',1,'pcs::CppStringT::TransTable::TransTable() noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a69a3ab2775d7e6537528a3eba3c4134a',1,'pcs::CppStringT::TransTable::TransTable(const TransTable &) noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa9182c3323cdba7f6dd30bfa56ebb8fe',1,'pcs::CppStringT::TransTable::TransTable(TransTable &&) noexcept=default']]] ]; diff --git a/cpp-strings/html/search/all_14.js b/cpp-strings/html/search/all_14.js new file mode 100644 index 0000000..714c8b3 --- /dev/null +++ b/cpp-strings/html/search/all_14.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['upper_0',['upper',['../classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120',1,'pcs::CppStringT::upper() noexcept'],['../classpcs_1_1_cpp_string_t.html#af5ff8cdba1d90516915e20f93567a9a9',1,'pcs::CppStringT::upper(const value_type ch) noexcept']]], + ['use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/cpp-strings/html/search/all_15.js b/cpp-strings/html/search/all_15.js new file mode 100644 index 0000000..a833894 --- /dev/null +++ b/cpp-strings/html/search/all_15.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['what_20if_20c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['where_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/cpp-strings/html/search/all_16.js b/cpp-strings/html/search/all_16.js new file mode 100644 index 0000000..09848bb --- /dev/null +++ b/cpp-strings/html/search/all_16.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['zfill_0',['zfill',['../classpcs_1_1_cpp_string_t.html#ad3d2b94f37325096205e399b95e9fc5d',1,'pcs::CppStringT']]] +]; diff --git a/cpp-strings/html/search/all_17.js b/cpp-strings/html/search/all_17.js new file mode 100644 index 0000000..d67d134 --- /dev/null +++ b/cpp-strings/html/search/all_17.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['_7eslice_0',['~Slice',['../classpcs_1_1_slice.html#abdb6694913ed37cf4efc5d85e990c7b5',1,'pcs::Slice']]], + ['_7estartslice_1',['~StartSlice',['../structpcs_1_1_start_slice.html#a6f792a61218b7598f8f6bb37dcdae56e',1,'pcs::StartSlice']]], + ['_7estartstepslice_2',['~StartStepSlice',['../structpcs_1_1_start_step_slice.html#adc0aae8a3849379742e23c4f3a3197a9',1,'pcs::StartStepSlice']]], + ['_7estartstopslice_3',['~StartStopSlice',['../structpcs_1_1_start_stop_slice.html#a95df964c79860a475a63da3e56301ea7',1,'pcs::StartStopSlice']]], + ['_7estepslice_4',['~StepSlice',['../structpcs_1_1_step_slice.html#a93892e4d8f153a06a65e0cd13ebfa949',1,'pcs::StepSlice']]], + ['_7estopslice_5',['~StopSlice',['../structpcs_1_1_stop_slice.html#a6e7e761a846ec00b1f24be9f83830f25',1,'pcs::StopSlice']]], + ['_7estopstepslice_6',['~StopStepSlice',['../structpcs_1_1_stop_step_slice.html#aa62d3d31f646766a6ea2ef3cd9f91491',1,'pcs::StopStepSlice']]], + ['_7etranstable_7',['~TransTable',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#abbbcd9cf0c3ac0a364864f734363dd4c',1,'pcs::CppStringT::TransTable']]] +]; diff --git a/cpp-strings/html/search/all_2.js b/cpp-strings/html/search/all_2.js index dcd0f07..48bd79f 100644 --- a/cpp-strings/html/search/all_2.js +++ b/cpp-strings/html/search/all_2.js @@ -1,5 +1,5 @@ var searchData= [ - ['2025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['224_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]] + ['2025_2007_0',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] ]; diff --git a/cpp-strings/html/search/all_3.js b/cpp-strings/html/search/all_3.js index fcada0a..10a6632 100644 --- a/cpp-strings/html/search/all_3.js +++ b/cpp-strings/html/search/all_3.js @@ -1,4 +1,5 @@ var searchData= [ - ['begin_0',['begin',['../classpcs_1_1_slice.html#ab55cf50ae2018337b942e7b9e08e3e6d',1,'pcs::Slice']]] + ['as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] ]; diff --git a/cpp-strings/html/search/all_4.js b/cpp-strings/html/search/all_4.js index ef0e766..fcada0a 100644 --- a/cpp-strings/html/search/all_4.js +++ b/cpp-strings/html/search/all_4.js @@ -1,15 +1,4 @@ var searchData= [ - ['capitalize_0',['capitalize',['../classpcs_1_1_cpp_string_t.html#a48a00cca031b9c29d1912508e120a5f6',1,'pcs::CppStringT']]], - ['center_1',['center',['../classpcs_1_1_cpp_string_t.html#af18311d8608e71627bc85f96581e4dd3',1,'pcs::CppStringT']]], - ['contains_2',['contains',['../classpcs_1_1_cpp_string_t.html#a0674e29327353aabf83d0e207fed31ed',1,'pcs::CppStringT']]], - ['contains_5fn_3',['contains_n',['../classpcs_1_1_cpp_string_t.html#a031b05f290f589b2df52bb84252c27c7',1,'pcs::CppStringT']]], - ['count_4',['count',['../classpcs_1_1_cpp_string_t.html#a7beda74b4d5092845a970d51d01fe4bf',1,'pcs::CppStringT']]], - ['count_5fn_5',['count_n',['../classpcs_1_1_cpp_string_t.html#a76f97d56e1713182d5e85d58cd445d10',1,'pcs::CppStringT::count_n(const CppStringT &sub, const size_type start, const size_type length) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a59839e3b5a186c2554224dbf4528c1b4',1,'pcs::CppStringT::count_n(const CppStringT &sub, const size_type length) const noexcept']]], - ['cpp_20string_6',['Library cpp-string',['../index.html',1,'']]], - ['cppstring_7',['CppString',['../namespacepcs.html#a08d21c458d61442667df24212920d0d9',1,'pcs']]], - ['cppstringt_8',['CppStringT',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], - ['cppstringt_3c_20char_20_3e_9',['CppStringT< char >',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], - ['cppstringt_3c_20wchar_5ft_20_3e_10',['CppStringT< wchar_t >',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], - ['cppwstring_11',['CppWString',['../namespacepcs.html#a79a822cea8e301fd51d2ed51dff57286',1,'pcs']]] + ['begin_0',['begin',['../classpcs_1_1_slice.html#ab55cf50ae2018337b942e7b9e08e3e6d',1,'pcs::Slice']]] ]; diff --git a/cpp-strings/html/search/all_5.js b/cpp-strings/html/search/all_5.js index d88008c..89e53e5 100644 --- a/cpp-strings/html/search/all_5.js +++ b/cpp-strings/html/search/all_5.js @@ -1,7 +1,16 @@ var searchData= [ - ['end_0',['end',['../classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c',1,'pcs::Slice']]], - ['endswith_1',['endswith',['../classpcs_1_1_cpp_string_t.html#a42f1e87d7f1903536ee79aa058d5c867',1,'pcs::CppStringT::endswith(const CppStringT &suffix, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b23210d7d5eb07c9f942d62cc76b05e',1,'pcs::CppStringT::endswith(const CppStringT &suffix, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a3e9da0bfa54e84420e81668f6ce7f52c',1,'pcs::CppStringT::endswith(const CppStringT &suffix) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a87b25fce2a05421efd718c599a784a09',1,'pcs::CppStringT::endswith(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type end) const noexcept']]], - ['endswith_5fn_2',['endswith_n',['../classpcs_1_1_cpp_string_t.html#a7eca5636b598c6fc107452ddd04a2f17',1,'pcs::CppStringT::endswith_n(const CppStringT &suffix, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a619935926ef961883e9bbd92b2fc23bd',1,'pcs::CppStringT::endswith_n(const CppStringT &suffix, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a4fd91047ab0126c823aa391a699e03bf',1,'pcs::CppStringT::endswith_n(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type count) const noexcept']]], - ['expand_5ftabs_3',['expand_tabs',['../classpcs_1_1_cpp_string_t.html#a2cc04d5062162ff5f7b6111d6f1e78e8',1,'pcs::CppStringT']]] + ['c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['capitalize_1',['capitalize',['../classpcs_1_1_cpp_string_t.html#a48a00cca031b9c29d1912508e120a5f6',1,'pcs::CppStringT']]], + ['center_2',['center',['../classpcs_1_1_cpp_string_t.html#af18311d8608e71627bc85f96581e4dd3',1,'pcs::CppStringT']]], + ['contains_3',['contains',['../classpcs_1_1_cpp_string_t.html#a0674e29327353aabf83d0e207fed31ed',1,'pcs::CppStringT']]], + ['contains_5fn_4',['contains_n',['../classpcs_1_1_cpp_string_t.html#a031b05f290f589b2df52bb84252c27c7',1,'pcs::CppStringT']]], + ['count_5',['count',['../classpcs_1_1_cpp_string_t.html#a7beda74b4d5092845a970d51d01fe4bf',1,'pcs::CppStringT']]], + ['count_5fn_6',['count_n',['../classpcs_1_1_cpp_string_t.html#a76f97d56e1713182d5e85d58cd445d10',1,'pcs::CppStringT::count_n(const CppStringT &sub, const size_type start, const size_type length) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a59839e3b5a186c2554224dbf4528c1b4',1,'pcs::CppStringT::count_n(const CppStringT &sub, const size_type length) const noexcept']]], + ['cpp_20strings_7',['Library cpp-strings',['../index.html',1,'']]], + ['cppstring_8',['CppString',['../namespacepcs.html#a08d21c458d61442667df24212920d0d9',1,'pcs']]], + ['cppstringt_9',['CppStringT',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], + ['cppstringt_3c_20char_20_3e_10',['CppStringT< char >',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], + ['cppstringt_3c_20wchar_5ft_20_3e_11',['CppStringT< wchar_t >',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], + ['cppwstring_12',['CppWString',['../namespacepcs.html#a79a822cea8e301fd51d2ed51dff57286',1,'pcs']]] ]; diff --git a/cpp-strings/html/search/all_6.js b/cpp-strings/html/search/all_6.js index 8398f06..534d42d 100644 --- a/cpp-strings/html/search/all_6.js +++ b/cpp-strings/html/search/all_6.js @@ -1,6 +1,4 @@ var searchData= [ - ['find_0',['find',['../classpcs_1_1_cpp_string_t.html#a24c4b7a0f713373cb3287d92289562ad',1,'pcs::CppStringT']]], - ['find_5fn_1',['find_n',['../classpcs_1_1_cpp_string_t.html#ac4c9351bb52eb9a62fa7fb2e2d5f054d',1,'pcs::CppStringT::find_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b0bc87b284120d0d3bfc685984997c0',1,'pcs::CppStringT::find_n(const CppStringT &sub, const size_type count) const noexcept']]], - ['format_2',['format',['../classpcs_1_1_cpp_string_t.html#a5caecc371bf390272283ceb7a15c6c1d',1,'pcs::CppStringT::format(const std::basic_format_string< T, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)'],['../classpcs_1_1_cpp_string_t.html#a1a89389b38fd6af3ea8db3489dd82f70',1,'pcs::CppStringT::format(const std::basic_format_string< char, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)'],['../classpcs_1_1_cpp_string_t.html#a944e066f3a863c354a5613a6eda17374',1,'pcs::CppStringT::format(const std::basic_format_string< wchar_t, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)']]] + ['documentation_0',['Documentation',['../index.html#autotoc_md9',1,'']]] ]; diff --git a/cpp-strings/html/search/all_7.js b/cpp-strings/html/search/all_7.js index 223f85b..69d5fd0 100644 --- a/cpp-strings/html/search/all_7.js +++ b/cpp-strings/html/search/all_7.js @@ -1,4 +1,8 @@ var searchData= [ - ['get_5ftable_0',['get_table',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#ab7a09175127849e20aa8aa5b999b4413',1,'pcs::CppStringT::TransTable']]] + ['easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['end_1',['end',['../classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c',1,'pcs::Slice']]], + ['endswith_2',['endswith',['../classpcs_1_1_cpp_string_t.html#a42f1e87d7f1903536ee79aa058d5c867',1,'pcs::CppStringT::endswith(const CppStringT &suffix, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b23210d7d5eb07c9f942d62cc76b05e',1,'pcs::CppStringT::endswith(const CppStringT &suffix, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a3e9da0bfa54e84420e81668f6ce7f52c',1,'pcs::CppStringT::endswith(const CppStringT &suffix) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a87b25fce2a05421efd718c599a784a09',1,'pcs::CppStringT::endswith(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type end) const noexcept']]], + ['endswith_5fn_3',['endswith_n',['../classpcs_1_1_cpp_string_t.html#a7eca5636b598c6fc107452ddd04a2f17',1,'pcs::CppStringT::endswith_n(const CppStringT &suffix, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a619935926ef961883e9bbd92b2fc23bd',1,'pcs::CppStringT::endswith_n(const CppStringT &suffix, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a4fd91047ab0126c823aa391a699e03bf',1,'pcs::CppStringT::endswith_n(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type count) const noexcept']]], + ['expand_5ftabs_4',['expand_tabs',['../classpcs_1_1_cpp_string_t.html#a2cc04d5062162ff5f7b6111d6f1e78e8',1,'pcs::CppStringT']]] ]; diff --git a/cpp-strings/html/search/all_8.js b/cpp-strings/html/search/all_8.js index 93d42bc..8398f06 100644 --- a/cpp-strings/html/search/all_8.js +++ b/cpp-strings/html/search/all_8.js @@ -1,50 +1,6 @@ var searchData= [ - ['index_0',['index',['../classpcs_1_1_cpp_string_t.html#a277a2b8a3b93951ccb94b6bf39daa582',1,'pcs::CppStringT']]], - ['index_5fn_1',['index_n',['../classpcs_1_1_cpp_string_t.html#aee94d4b52483021051b168e776b18569',1,'pcs::CppStringT::index_n(const CppStringT &sub, const size_type start, const size_type count) const'],['../classpcs_1_1_cpp_string_t.html#a19a51054b824add817f30c5ff03effe7',1,'pcs::CppStringT::index_n(const CppStringT &sub, const size_type count) const']]], - ['intro_2',['Intro',['../index.html#autotoc_md3',1,'']]], - ['is_5falpha_3',['is_alpha',['../namespacepcs.html#a40bc3d234e3c737f34d267151ca62014',1,'pcs']]], - ['is_5falpha_3c_20char_20_3e_4',['is_alpha< char >',['../namespacepcs.html#ade5b26313fc856bb882109d6945629b8',1,'pcs']]], - ['is_5falpha_3c_20wchar_5ft_20_3e_5',['is_alpha< wchar_t >',['../namespacepcs.html#a069625790af3ecf05a424c2c53eabfc0',1,'pcs']]], - ['is_5fascii_6',['is_ascii',['../namespacepcs.html#ac7822fd0c570f69d597936a24c38ba2a',1,'pcs']]], - ['is_5fdecimal_7',['is_decimal',['../namespacepcs.html#a9f0ba4e85fc273fad1a8b489f3be7fa8',1,'pcs']]], - ['is_5fdecimal_3c_20char_20_3e_8',['is_decimal< char >',['../namespacepcs.html#a28f77929d599a862403a4471f6b73fc3',1,'pcs']]], - ['is_5fdecimal_3c_20wchar_5ft_20_3e_9',['is_decimal< wchar_t >',['../namespacepcs.html#a60a2017b25d3d06b83e72f5ed5a93d09',1,'pcs']]], - ['is_5fdigit_10',['is_digit',['../namespacepcs.html#a52b12f8beb4ab7d8b819ca24180e08d1',1,'pcs']]], - ['is_5fdigit_3c_20char_20_3e_11',['is_digit< char >',['../namespacepcs.html#af7c58514e3378a219904f22eb22e9072',1,'pcs']]], - ['is_5fdigit_3c_20wchar_5ft_20_3e_12',['is_digit< wchar_t >',['../namespacepcs.html#a01c6093b1a8ef52114f799635ff930d5',1,'pcs']]], - ['is_5fid_5fcontinue_13',['is_id_continue',['../namespacepcs.html#aef0240331a343bb1ad13eb613ca93fa4',1,'pcs']]], - ['is_5fid_5fstart_14',['is_id_start',['../namespacepcs.html#abfda7874fe5b1f72c1c5a9a04d5c7e42',1,'pcs']]], - ['is_5flower_15',['is_lower',['../namespacepcs.html#aedd570e9ffa0572d56fce5085594bdbb',1,'pcs']]], - ['is_5flower_3c_20char_20_3e_16',['is_lower< char >',['../namespacepcs.html#a29893984c95e53a6efe01f74c2dcc03a',1,'pcs']]], - ['is_5flower_3c_20wchar_5ft_20_3e_17',['is_lower< wchar_t >',['../namespacepcs.html#ad1d1b13c16ce784055e93af9fa34fb5c',1,'pcs']]], - ['is_5fnumeric_18',['is_numeric',['../namespacepcs.html#af1b60c1081e8bc3b4cd91fbe240e9b87',1,'pcs']]], - ['is_5fnumeric_3c_20char_20_3e_19',['is_numeric< char >',['../namespacepcs.html#a242e3c28e3d47d19d70ab70d83e74d35',1,'pcs']]], - ['is_5fnumeric_3c_20wchar_5ft_20_3e_20',['is_numeric< wchar_t >',['../namespacepcs.html#acab7e7bb1ffd6e4ea1a8300b05478647',1,'pcs']]], - ['is_5fprintable_21',['is_printable',['../namespacepcs.html#a51cd6883557ab31a1e0c8e7b5ab27351',1,'pcs']]], - ['is_5fprintable_3c_20char_20_3e_22',['is_printable< char >',['../namespacepcs.html#a1cd19ec212e3ada992a8effb8d5d872d',1,'pcs']]], - ['is_5fprintable_3c_20wchar_5ft_20_3e_23',['is_printable< wchar_t >',['../namespacepcs.html#a30ed0cd7942d081369f78a49a029d8b1',1,'pcs']]], - ['is_5fpunctuation_24',['is_punctuation',['../namespacepcs.html#a02d340dd9c510eda0fbfed07a08d0792',1,'pcs']]], - ['is_5fpunctuation_3c_20char_20_3e_25',['is_punctuation< char >',['../namespacepcs.html#aa36d34c2227cde5856e8d61fa6e4af58',1,'pcs']]], - ['is_5fpunctuation_3c_20wchar_5ft_20_3e_26',['is_punctuation< wchar_t >',['../namespacepcs.html#a363e2bac9c403a623c5a410f7113edd3',1,'pcs']]], - ['is_5fspace_27',['is_space',['../namespacepcs.html#af089ceadbeaab27e12ad7f7edaaec72a',1,'pcs']]], - ['is_5fspace_3c_20char_20_3e_28',['is_space< char >',['../namespacepcs.html#a714cfa835ef4db5180309829ee8e27a9',1,'pcs']]], - ['is_5fspace_3c_20wchar_5ft_20_3e_29',['is_space< wchar_t >',['../namespacepcs.html#a57a765c6eb624107a2176a56cf2220a7',1,'pcs']]], - ['is_5fupper_30',['is_upper',['../namespacepcs.html#a8cb1cd0a1e39d92893eb7d22145f5d65',1,'pcs']]], - ['is_5fupper_3c_20char_20_3e_31',['is_upper< char >',['../namespacepcs.html#ac25d471fa1d838401335776ad4b6ead1',1,'pcs']]], - ['is_5fupper_3c_20wchar_5ft_20_3e_32',['is_upper< wchar_t >',['../namespacepcs.html#ab5077443809e9e4eb7bfa463728f398a',1,'pcs']]], - ['is_5fwords_5fsep_33',['is_words_sep',['../classpcs_1_1_cpp_string_t.html#a7565e4f2958e485ee2b0815be1faa0fa',1,'pcs::CppStringT']]], - ['isalnum_34',['isalnum',['../classpcs_1_1_cpp_string_t.html#a8fdf96ffee524d5b795c4aad26ece6ae',1,'pcs::CppStringT']]], - ['isalpha_35',['isalpha',['../classpcs_1_1_cpp_string_t.html#a447b7c58b4be1cdcba3aedf189acbce7',1,'pcs::CppStringT']]], - ['isascii_36',['isascii',['../classpcs_1_1_cpp_string_t.html#a710631f31d4c63c2117e8f4804fad3f2',1,'pcs::CppStringT']]], - ['isdecimal_37',['isdecimal',['../classpcs_1_1_cpp_string_t.html#a0b9d8a55419274e7cfd9badb4df704e3',1,'pcs::CppStringT']]], - ['isdigit_38',['isdigit',['../classpcs_1_1_cpp_string_t.html#a21316d00180377a3f48910a6c4c43b9c',1,'pcs::CppStringT']]], - ['isidentifier_39',['isidentifier',['../classpcs_1_1_cpp_string_t.html#a91f72d425dbb4c53a066338d30683246',1,'pcs::CppStringT']]], - ['islower_40',['islower',['../classpcs_1_1_cpp_string_t.html#ae4ff448bb92e6499c0a76f7d8e11126c',1,'pcs::CppStringT']]], - ['isnumeric_41',['isnumeric',['../classpcs_1_1_cpp_string_t.html#a578176ed20fd8da965afbcae1d99dd59',1,'pcs::CppStringT']]], - ['isprintable_42',['isprintable',['../classpcs_1_1_cpp_string_t.html#a6257a1832da550d4be32e9f272e51265',1,'pcs::CppStringT']]], - ['ispunctuation_43',['ispunctuation',['../classpcs_1_1_cpp_string_t.html#a2842f3a067fdc674709bed048d64e12d',1,'pcs::CppStringT']]], - ['isspace_44',['isspace',['../classpcs_1_1_cpp_string_t.html#a959a8f56bb536f2474ffc649a7ad3290',1,'pcs::CppStringT']]], - ['istitle_45',['istitle',['../classpcs_1_1_cpp_string_t.html#ad72611f339c2b9027a72fa26f25748c3',1,'pcs::CppStringT']]], - ['isupper_46',['isupper',['../classpcs_1_1_cpp_string_t.html#af2784cbe9655bb8e23fe90375d79e69c',1,'pcs::CppStringT']]] + ['find_0',['find',['../classpcs_1_1_cpp_string_t.html#a24c4b7a0f713373cb3287d92289562ad',1,'pcs::CppStringT']]], + ['find_5fn_1',['find_n',['../classpcs_1_1_cpp_string_t.html#ac4c9351bb52eb9a62fa7fb2e2d5f054d',1,'pcs::CppStringT::find_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b0bc87b284120d0d3bfc685984997c0',1,'pcs::CppStringT::find_n(const CppStringT &sub, const size_type count) const noexcept']]], + ['format_2',['format',['../classpcs_1_1_cpp_string_t.html#a5caecc371bf390272283ceb7a15c6c1d',1,'pcs::CppStringT::format(const std::basic_format_string< T, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)'],['../classpcs_1_1_cpp_string_t.html#a1a89389b38fd6af3ea8db3489dd82f70',1,'pcs::CppStringT::format(const std::basic_format_string< char, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)'],['../classpcs_1_1_cpp_string_t.html#a944e066f3a863c354a5613a6eda17374',1,'pcs::CppStringT::format(const std::basic_format_string< wchar_t, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)']]] ]; diff --git a/cpp-strings/html/search/all_9.js b/cpp-strings/html/search/all_9.js index 2baa4c9..223f85b 100644 --- a/cpp-strings/html/search/all_9.js +++ b/cpp-strings/html/search/all_9.js @@ -1,4 +1,4 @@ var searchData= [ - ['join_0',['join',['../classpcs_1_1_cpp_string_t.html#ac1b427d4cc4c2aed8252b3526b63f1b1',1,'pcs::CppStringT::join(const std::array< CppStringT, N > &strs) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a9eed3f6c5e09f98f3d5916cc5b3a4311',1,'pcs::CppStringT::join(const std::vector< CppStringT > &strs) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a545d669bb9296b5695b01ac8680bf3f4',1,'pcs::CppStringT::join(const CppStringT &first, const NextCppStringsT &... others) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a30860a043574996d85c80e49ef618594',1,'pcs::CppStringT::join(const CppStringT &s) const noexcept'],['../classpcs_1_1_cpp_string_t.html#aa3523b858357399995e4fb9ec796c96c',1,'pcs::CppStringT::join() const noexcept']]] + ['get_5ftable_0',['get_table',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#ab7a09175127849e20aa8aa5b999b4413',1,'pcs::CppStringT::TransTable']]] ]; diff --git a/cpp-strings/html/search/all_a.js b/cpp-strings/html/search/all_a.js index 87c4c4d..47a186c 100644 --- a/cpp-strings/html/search/all_a.js +++ b/cpp-strings/html/search/all_a.js @@ -1,9 +1,52 @@ var searchData= [ - ['latest_20release_20release_201_200_201_200_200_20224_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['library_20cpp_20string_1',['Library cpp-string',['../index.html',1,'']]], - ['license_2',['License',['../index.html#autotoc_md2',1,'']]], - ['ljust_3',['ljust',['../classpcs_1_1_cpp_string_t.html#aed96c44c384cab45342122cd7e2f02eb',1,'pcs::CppStringT']]], - ['lower_4',['lower',['../classpcs_1_1_cpp_string_t.html#ad5c765eaa85cb4a3e7a914d55a6a5175',1,'pcs::CppStringT::lower() noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b1cfc9713e55a48f036ed030bedc654',1,'pcs::CppStringT::lower(const value_type ch) noexcept']]], - ['lstrip_5',['lstrip',['../classpcs_1_1_cpp_string_t.html#aee6e48d5b478d5bab239f54523d23c15',1,'pcs::CppStringT::lstrip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ac1ad3018d38f291e6debad8d2de92be1',1,'pcs::CppStringT::lstrip() const noexcept']]] + ['if_20c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['in_20release_201_200_1',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['index_2',['index',['../classpcs_1_1_cpp_string_t.html#a277a2b8a3b93951ccb94b6bf39daa582',1,'pcs::CppStringT']]], + ['index_5fn_3',['index_n',['../classpcs_1_1_cpp_string_t.html#aee94d4b52483021051b168e776b18569',1,'pcs::CppStringT::index_n(const CppStringT &sub, const size_type start, const size_type count) const'],['../classpcs_1_1_cpp_string_t.html#a19a51054b824add817f30c5ff03effe7',1,'pcs::CppStringT::index_n(const CppStringT &sub, const size_type count) const']]], + ['intro_4',['Intro',['../index.html#autotoc_md4',1,'']]], + ['is_5falpha_5',['is_alpha',['../namespacepcs.html#a40bc3d234e3c737f34d267151ca62014',1,'pcs']]], + ['is_5falpha_3c_20char_20_3e_6',['is_alpha< char >',['../namespacepcs.html#ade5b26313fc856bb882109d6945629b8',1,'pcs']]], + ['is_5falpha_3c_20wchar_5ft_20_3e_7',['is_alpha< wchar_t >',['../namespacepcs.html#a069625790af3ecf05a424c2c53eabfc0',1,'pcs']]], + ['is_5fascii_8',['is_ascii',['../namespacepcs.html#ac7822fd0c570f69d597936a24c38ba2a',1,'pcs']]], + ['is_5fdecimal_9',['is_decimal',['../namespacepcs.html#a9f0ba4e85fc273fad1a8b489f3be7fa8',1,'pcs']]], + ['is_5fdecimal_3c_20char_20_3e_10',['is_decimal< char >',['../namespacepcs.html#a28f77929d599a862403a4471f6b73fc3',1,'pcs']]], + ['is_5fdecimal_3c_20wchar_5ft_20_3e_11',['is_decimal< wchar_t >',['../namespacepcs.html#a60a2017b25d3d06b83e72f5ed5a93d09',1,'pcs']]], + ['is_5fdigit_12',['is_digit',['../namespacepcs.html#a52b12f8beb4ab7d8b819ca24180e08d1',1,'pcs']]], + ['is_5fdigit_3c_20char_20_3e_13',['is_digit< char >',['../namespacepcs.html#af7c58514e3378a219904f22eb22e9072',1,'pcs']]], + ['is_5fdigit_3c_20wchar_5ft_20_3e_14',['is_digit< wchar_t >',['../namespacepcs.html#a01c6093b1a8ef52114f799635ff930d5',1,'pcs']]], + ['is_5fid_5fcontinue_15',['is_id_continue',['../namespacepcs.html#aef0240331a343bb1ad13eb613ca93fa4',1,'pcs']]], + ['is_5fid_5fstart_16',['is_id_start',['../namespacepcs.html#abfda7874fe5b1f72c1c5a9a04d5c7e42',1,'pcs']]], + ['is_5flower_17',['is_lower',['../namespacepcs.html#aedd570e9ffa0572d56fce5085594bdbb',1,'pcs']]], + ['is_5flower_3c_20char_20_3e_18',['is_lower< char >',['../namespacepcs.html#a29893984c95e53a6efe01f74c2dcc03a',1,'pcs']]], + ['is_5flower_3c_20wchar_5ft_20_3e_19',['is_lower< wchar_t >',['../namespacepcs.html#ad1d1b13c16ce784055e93af9fa34fb5c',1,'pcs']]], + ['is_5fnumeric_20',['is_numeric',['../namespacepcs.html#af1b60c1081e8bc3b4cd91fbe240e9b87',1,'pcs']]], + ['is_5fnumeric_3c_20char_20_3e_21',['is_numeric< char >',['../namespacepcs.html#a242e3c28e3d47d19d70ab70d83e74d35',1,'pcs']]], + ['is_5fnumeric_3c_20wchar_5ft_20_3e_22',['is_numeric< wchar_t >',['../namespacepcs.html#acab7e7bb1ffd6e4ea1a8300b05478647',1,'pcs']]], + ['is_5fprintable_23',['is_printable',['../namespacepcs.html#a51cd6883557ab31a1e0c8e7b5ab27351',1,'pcs']]], + ['is_5fprintable_3c_20char_20_3e_24',['is_printable< char >',['../namespacepcs.html#a1cd19ec212e3ada992a8effb8d5d872d',1,'pcs']]], + ['is_5fprintable_3c_20wchar_5ft_20_3e_25',['is_printable< wchar_t >',['../namespacepcs.html#a30ed0cd7942d081369f78a49a029d8b1',1,'pcs']]], + ['is_5fpunctuation_26',['is_punctuation',['../namespacepcs.html#a02d340dd9c510eda0fbfed07a08d0792',1,'pcs']]], + ['is_5fpunctuation_3c_20char_20_3e_27',['is_punctuation< char >',['../namespacepcs.html#aa36d34c2227cde5856e8d61fa6e4af58',1,'pcs']]], + ['is_5fpunctuation_3c_20wchar_5ft_20_3e_28',['is_punctuation< wchar_t >',['../namespacepcs.html#a363e2bac9c403a623c5a410f7113edd3',1,'pcs']]], + ['is_5fspace_29',['is_space',['../namespacepcs.html#af089ceadbeaab27e12ad7f7edaaec72a',1,'pcs']]], + ['is_5fspace_3c_20char_20_3e_30',['is_space< char >',['../namespacepcs.html#a714cfa835ef4db5180309829ee8e27a9',1,'pcs']]], + ['is_5fspace_3c_20wchar_5ft_20_3e_31',['is_space< wchar_t >',['../namespacepcs.html#a57a765c6eb624107a2176a56cf2220a7',1,'pcs']]], + ['is_5fupper_32',['is_upper',['../namespacepcs.html#a8cb1cd0a1e39d92893eb7d22145f5d65',1,'pcs']]], + ['is_5fupper_3c_20char_20_3e_33',['is_upper< char >',['../namespacepcs.html#ac25d471fa1d838401335776ad4b6ead1',1,'pcs']]], + ['is_5fupper_3c_20wchar_5ft_20_3e_34',['is_upper< wchar_t >',['../namespacepcs.html#ab5077443809e9e4eb7bfa463728f398a',1,'pcs']]], + ['is_5fwords_5fsep_35',['is_words_sep',['../classpcs_1_1_cpp_string_t.html#a7565e4f2958e485ee2b0815be1faa0fa',1,'pcs::CppStringT']]], + ['isalnum_36',['isalnum',['../classpcs_1_1_cpp_string_t.html#a8fdf96ffee524d5b795c4aad26ece6ae',1,'pcs::CppStringT']]], + ['isalpha_37',['isalpha',['../classpcs_1_1_cpp_string_t.html#a447b7c58b4be1cdcba3aedf189acbce7',1,'pcs::CppStringT']]], + ['isascii_38',['isascii',['../classpcs_1_1_cpp_string_t.html#a710631f31d4c63c2117e8f4804fad3f2',1,'pcs::CppStringT']]], + ['isdecimal_39',['isdecimal',['../classpcs_1_1_cpp_string_t.html#a0b9d8a55419274e7cfd9badb4df704e3',1,'pcs::CppStringT']]], + ['isdigit_40',['isdigit',['../classpcs_1_1_cpp_string_t.html#a21316d00180377a3f48910a6c4c43b9c',1,'pcs::CppStringT']]], + ['isidentifier_41',['isidentifier',['../classpcs_1_1_cpp_string_t.html#a91f72d425dbb4c53a066338d30683246',1,'pcs::CppStringT']]], + ['islower_42',['islower',['../classpcs_1_1_cpp_string_t.html#ae4ff448bb92e6499c0a76f7d8e11126c',1,'pcs::CppStringT']]], + ['isnumeric_43',['isnumeric',['../classpcs_1_1_cpp_string_t.html#a578176ed20fd8da965afbcae1d99dd59',1,'pcs::CppStringT']]], + ['isprintable_44',['isprintable',['../classpcs_1_1_cpp_string_t.html#a6257a1832da550d4be32e9f272e51265',1,'pcs::CppStringT']]], + ['ispunctuation_45',['ispunctuation',['../classpcs_1_1_cpp_string_t.html#a2842f3a067fdc674709bed048d64e12d',1,'pcs::CppStringT']]], + ['isspace_46',['isspace',['../classpcs_1_1_cpp_string_t.html#a959a8f56bb536f2474ffc649a7ad3290',1,'pcs::CppStringT']]], + ['istitle_47',['istitle',['../classpcs_1_1_cpp_string_t.html#ad72611f339c2b9027a72fa26f25748c3',1,'pcs::CppStringT']]], + ['isupper_48',['isupper',['../classpcs_1_1_cpp_string_t.html#af2784cbe9655bb8e23fe90375d79e69c',1,'pcs::CppStringT']]] ]; diff --git a/cpp-strings/html/search/all_b.js b/cpp-strings/html/search/all_b.js index 2f667d3..2baa4c9 100644 --- a/cpp-strings/html/search/all_b.js +++ b/cpp-strings/html/search/all_b.js @@ -1,4 +1,4 @@ var searchData= [ - ['notfoundexception_0',['NotFoundException',['../classpcs_1_1_cpp_string_t_1_1_not_found_exception.html',1,'pcs::CppStringT']]] + ['join_0',['join',['../classpcs_1_1_cpp_string_t.html#ac1b427d4cc4c2aed8252b3526b63f1b1',1,'pcs::CppStringT::join(const std::array< CppStringT, N > &strs) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a9eed3f6c5e09f98f3d5916cc5b3a4311',1,'pcs::CppStringT::join(const std::vector< CppStringT > &strs) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a545d669bb9296b5695b01ac8680bf3f4',1,'pcs::CppStringT::join(const CppStringT &first, const NextCppStringsT &... others) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a30860a043574996d85c80e49ef618594',1,'pcs::CppStringT::join(const CppStringT &s) const noexcept'],['../classpcs_1_1_cpp_string_t.html#aa3523b858357399995e4fb9ec796c96c',1,'pcs::CppStringT::join() const noexcept']]] ]; diff --git a/cpp-strings/html/search/all_c.js b/cpp-strings/html/search/all_c.js index 9768167..49c383d 100644 --- a/cpp-strings/html/search/all_c.js +++ b/cpp-strings/html/search/all_c.js @@ -1,9 +1,9 @@ var searchData= [ - ['operator_22_22_5fcs_0',['operator""_cs',['../namespacepcs.html#afb8dd890fe893aba3264ac7df4fe7124',1,'pcs::operator""_cs(const char *str, std::size_t len)'],['../namespacepcs.html#acb7395de8ef88696d0c8c9772e172118',1,'pcs::operator""_cs(const wchar_t *str, std::size_t len)']]], - ['operator_28_29_1',['operator()',['../classpcs_1_1_cpp_string_t.html#a1fa8862a5f306553d6f0dae7e76fce83',1,'pcs::CppStringT::operator()(Slice< IntT > slice) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a0daec57ccab4601f46e9d1c258407765',1,'pcs::CppStringT::operator()(const long long start, const long long stop, const long long step=1) const noexcept']]], - ['operator_2a_2',['operator*',['../classpcs_1_1_cpp_string_t.html#a0995f5b5a01af3f4a749949e23d0d780',1,'pcs::CppStringT::operator*()'],['../classpcs_1_1_slice.html#afa6b7dc85e796da20dd5933d49400996',1,'pcs::Slice::operator*() noexcept']]], - ['operator_2b_2b_3',['operator++',['../classpcs_1_1_slice.html#a79edb1eb4e6bce136f730d82f7afeaff',1,'pcs::Slice::operator++() noexcept'],['../classpcs_1_1_slice.html#aa3e4bcf5cfd5917cc10e0641030984c2',1,'pcs::Slice::operator++(int) noexcept']]], - ['operator_3d_4',['operator=',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#addccd32880c403ee20a6a8423d8d3f8b',1,'pcs::CppStringT::TransTable::operator=(const TransTable &) noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a3efc5aab74f3a0594a9e88562d57867d',1,'pcs::CppStringT::TransTable::operator=(TransTable &&) noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a4f1dd7fb1ede54aa662c808eb84cda41',1,'pcs::CppStringT::TransTable::operator=(const std::map< key_type, value_type > &trans_table) noexcept'],['../classpcs_1_1_cpp_string_t.html#a30e26a3082ad50d01c7d0d98cb9e9c37',1,'pcs::CppStringT::operator=(const CppStringT &) noexcept=default'],['../classpcs_1_1_cpp_string_t.html#a810a3a27ee7396f9c472648978327a76',1,'pcs::CppStringT::operator=(CppStringT &&) noexcept=default']]], - ['operator_5b_5d_5',['operator[]',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a90ac2a729fc715870e7f32ea9c6536f9',1,'pcs::CppStringT::TransTable']]] + ['latest_20release_20release_201_200_201_200_200_20229_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['library_20cpp_20strings_1',['Library cpp-strings',['../index.html',1,'']]], + ['license_2',['License',['../index.html#autotoc_md3',1,'']]], + ['ljust_3',['ljust',['../classpcs_1_1_cpp_string_t.html#aed96c44c384cab45342122cd7e2f02eb',1,'pcs::CppStringT']]], + ['lower_4',['lower',['../classpcs_1_1_cpp_string_t.html#ad5c765eaa85cb4a3e7a914d55a6a5175',1,'pcs::CppStringT::lower() noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b1cfc9713e55a48f036ed030bedc654',1,'pcs::CppStringT::lower(const value_type ch) noexcept']]], + ['lstrip_5',['lstrip',['../classpcs_1_1_cpp_string_t.html#aee6e48d5b478d5bab239f54523d23c15',1,'pcs::CppStringT::lstrip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ac1ad3018d38f291e6debad8d2de92be1',1,'pcs::CppStringT::lstrip() const noexcept']]] ]; diff --git a/cpp-strings/html/search/all_d.js b/cpp-strings/html/search/all_d.js index 8cb9ee8..87ae8b8 100644 --- a/cpp-strings/html/search/all_d.js +++ b/cpp-strings/html/search/all_d.js @@ -1,5 +1,4 @@ var searchData= [ - ['partition_0',['partition',['../classpcs_1_1_cpp_string_t.html#ac5f88b0fc1f33cda23c30cb1f3bc560f',1,'pcs::CppStringT']]], - ['pcs_1',['pcs',['../namespacepcs.html',1,'']]] + ['missing_20parts_20in_20release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]] ]; diff --git a/cpp-strings/html/search/all_e.js b/cpp-strings/html/search/all_e.js index b2e92d3..2f667d3 100644 --- a/cpp-strings/html/search/all_e.js +++ b/cpp-strings/html/search/all_e.js @@ -1,16 +1,4 @@ var searchData= [ - ['release_201_200_201_200_200_20224_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['release_20release_201_200_201_200_200_20224_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['removeprefix_2',['removeprefix',['../classpcs_1_1_cpp_string_t.html#a058704b7f4538ec9e1798c5348d37c7a',1,'pcs::CppStringT']]], - ['removesuffix_3',['removesuffix',['../classpcs_1_1_cpp_string_t.html#ad6a8dc124ab8b7cab1cb328240763ed0',1,'pcs::CppStringT']]], - ['replace_4',['replace',['../classpcs_1_1_cpp_string_t.html#ad4f39683db649aa8a65907268c499f02',1,'pcs::CppStringT']]], - ['rfind_5',['rfind',['../classpcs_1_1_cpp_string_t.html#af363308ba741b267641e1aa35669d603',1,'pcs::CppStringT::rfind(const CppStringT &sub, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a9f43f20029596abc1362d1242e68e5db',1,'pcs::CppStringT::rfind(const CppStringT &sub, const size_type start) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ac00bb6f7d74bfdde0d4cc247e78ab20e',1,'pcs::CppStringT::rfind(const CppStringT &sub) const noexcept']]], - ['rfind_5fn_6',['rfind_n',['../classpcs_1_1_cpp_string_t.html#a519a292eb3f0790d54a59a201f2d6410',1,'pcs::CppStringT::rfind_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a790f663f51dfe6e9e15d4f5f025bf107',1,'pcs::CppStringT::rfind_n(const CppStringT &sub, const size_type count) const noexcept']]], - ['rindex_7',['rindex',['../classpcs_1_1_cpp_string_t.html#a6693ec49258c6ac80a7875b3ebf3c916',1,'pcs::CppStringT::rindex(const CppStringT &sub, const size_type start, const size_type end) const'],['../classpcs_1_1_cpp_string_t.html#a2baca0ddff848de56a7b867f68d3efab',1,'pcs::CppStringT::rindex(const CppStringT &sub, const size_type start) const'],['../classpcs_1_1_cpp_string_t.html#a546105cc9a8a9d493979c30607092cf1',1,'pcs::CppStringT::rindex(const CppStringT &sub) const']]], - ['rindex_5fn_8',['rindex_n',['../classpcs_1_1_cpp_string_t.html#afc08a4e91b93710838c8f0d6234e057e',1,'pcs::CppStringT::rindex_n(const CppStringT &sub, const size_type start, const size_type count) const'],['../classpcs_1_1_cpp_string_t.html#ac3079cbecbdf4151e66f602f39ece836',1,'pcs::CppStringT::rindex_n(const CppStringT &sub, const size_type count) const']]], - ['rjust_9',['rjust',['../classpcs_1_1_cpp_string_t.html#a61fd4215938ec9f0fce1f885d6bb4a2b',1,'pcs::CppStringT']]], - ['rpartition_10',['rpartition',['../classpcs_1_1_cpp_string_t.html#a61674ee4e97038d82ea7ecc30b1761f6',1,'pcs::CppStringT']]], - ['rsplit_11',['rsplit',['../classpcs_1_1_cpp_string_t.html#a8111cd357773d304fbb496571d7ee6be',1,'pcs::CppStringT::rsplit() noexcept'],['../classpcs_1_1_cpp_string_t.html#a0419f46de6fa532372f3b97b4927ebab',1,'pcs::CppStringT::rsplit(const CppStringT &sep) noexcept'],['../classpcs_1_1_cpp_string_t.html#a3aa66706e268bd570a0084d70dff5cde',1,'pcs::CppStringT::rsplit(const size_type maxsplit) noexcept'],['../classpcs_1_1_cpp_string_t.html#ab0ace502f0b3026fefd2942a1e8a0456',1,'pcs::CppStringT::rsplit(const CppStringT &sep, const size_type maxsplit) noexcept']]], - ['rstrip_12',['rstrip',['../classpcs_1_1_cpp_string_t.html#a89e850d45d6dec167e763cf748a06971',1,'pcs::CppStringT::rstrip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a86f8c78b2eeb3541fb6b56b4f4ac237b',1,'pcs::CppStringT::rstrip() const noexcept']]] + ['notfoundexception_0',['NotFoundException',['../classpcs_1_1_cpp_string_t_1_1_not_found_exception.html',1,'pcs::CppStringT']]] ]; diff --git a/cpp-strings/html/search/all_f.js b/cpp-strings/html/search/all_f.js index 45f119f..9768167 100644 --- a/cpp-strings/html/search/all_f.js +++ b/cpp-strings/html/search/all_f.js @@ -1,22 +1,9 @@ var searchData= [ - ['slice_0',['Slice',['../classpcs_1_1_slice.html',1,'pcs::Slice< IntT >'],['../classpcs_1_1_slice.html#ab51c3b03351e495729545f2fdaebb888',1,'pcs::Slice::Slice()']]], - ['split_1',['split',['../classpcs_1_1_cpp_string_t.html#a7ca47096b03baa0091c3b0349d210931',1,'pcs::CppStringT::split() noexcept'],['../classpcs_1_1_cpp_string_t.html#acf4d923cfed55cfd90cf12651ce0ac3d',1,'pcs::CppStringT::split(const CppStringT &sep) noexcept'],['../classpcs_1_1_cpp_string_t.html#a8fa2afe84d7fc26f96bbd55f4266df2a',1,'pcs::CppStringT::split(const size_type maxsplit) noexcept'],['../classpcs_1_1_cpp_string_t.html#a55a3fa32de834f644ac28d7c2495fa77',1,'pcs::CppStringT::split(const CppStringT &sep, const size_type maxsplit) noexcept']]], - ['splitlines_2',['splitlines',['../classpcs_1_1_cpp_string_t.html#a0bd53df14569c307b5ca50a2e1e62960',1,'pcs::CppStringT']]], - ['start_3',['start',['../classpcs_1_1_slice.html#a5280a9d6974217c94de5d9027e10d4e1',1,'pcs::Slice']]], - ['startslice_4',['StartSlice',['../structpcs_1_1_start_slice.html',1,'pcs::StartSlice< IntT >'],['../structpcs_1_1_start_slice.html#ae435a090e0d93fe221cab4822e352886',1,'pcs::StartSlice::StartSlice()']]], - ['startstepslice_5',['StartStepSlice',['../structpcs_1_1_start_step_slice.html',1,'pcs::StartStepSlice< IntT >'],['../structpcs_1_1_start_step_slice.html#a438eef8b248cc00ed48afda08aff6d4c',1,'pcs::StartStepSlice::StartStepSlice()']]], - ['startstopslice_6',['StartStopSlice',['../structpcs_1_1_start_stop_slice.html',1,'pcs::StartStopSlice< IntT >'],['../structpcs_1_1_start_stop_slice.html#a7c8ad9cb9d63fb9d56b3dbc9647297b4',1,'pcs::StartStopSlice::StartStopSlice()']]], - ['startswith_7',['startswith',['../classpcs_1_1_cpp_string_t.html#a5a131c385a01ccc5410d4cffa55cf700',1,'pcs::CppStringT::startswith(const CppStringT &prefix, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ad2cfcc7bd22736ebd9f91f04e6a42f8c',1,'pcs::CppStringT::startswith(const CppStringT &prefix, const size_type start) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ae2f755ae7903586a2086b7b7f943d96e',1,'pcs::CppStringT::startswith(const CppStringT &prefix) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a326eb96e19c3559a84af86ff1bf54aa4',1,'pcs::CppStringT::startswith(const std::initializer_list< CppStringT > &prefixes, const size_type start, const size_type end) const noexcept']]], - ['startswith_5fn_8',['startswith_n',['../classpcs_1_1_cpp_string_t.html#a3b7955f9c7f9452a6a025caaaf0e6d73',1,'pcs::CppStringT::startswith_n(const CppStringT &prefix, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ae0865e2c7f8a4871804bf71c1c982dc6',1,'pcs::CppStringT::startswith_n(const CppStringT &prefix, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ab2b293c5f1b55af52ceb75b8f7e4d42e',1,'pcs::CppStringT::startswith_n(const std::initializer_list< CppStringT > &prefix, const size_type start, const size_type count) const noexcept']]], - ['step_9',['step',['../classpcs_1_1_slice.html#a55f046a5343a6ea1bbff8686d2e72d78',1,'pcs::Slice']]], - ['stepslice_10',['StepSlice',['../structpcs_1_1_step_slice.html',1,'pcs::StepSlice< IntT >'],['../structpcs_1_1_step_slice.html#ad24accb58329f71457fbaf00fbbbf874',1,'pcs::StepSlice::StepSlice()']]], - ['stop_11',['stop',['../classpcs_1_1_slice.html#a0fed0ac66885187eb64d1982e0461916',1,'pcs::Slice']]], - ['stopslice_12',['StopSlice',['../structpcs_1_1_stop_slice.html',1,'pcs::StopSlice< IntT >'],['../structpcs_1_1_stop_slice.html#a9d59c11b1bc398b71abc59b4071da379',1,'pcs::StopSlice::StopSlice()']]], - ['stopstepslice_13',['StopStepSlice',['../structpcs_1_1_stop_step_slice.html',1,'pcs::StopStepSlice< IntT >'],['../structpcs_1_1_stop_step_slice.html#a86288ad6b535b8b4d522e8173511c639',1,'pcs::StopStepSlice::StopStepSlice()']]], - ['string_14',['Library cpp-string',['../index.html',1,'']]], - ['strip_15',['strip',['../classpcs_1_1_cpp_string_t.html#a02919129cdf158e75eae1e9815a071bf',1,'pcs::CppStringT::strip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a12bc043347f555b4701e0c70d972058d',1,'pcs::CppStringT::strip() const noexcept']]], - ['substr_16',['substr',['../classpcs_1_1_cpp_string_t.html#a9debc70420a3fbc7722e3111aeccd819',1,'pcs::CppStringT']]], - ['swap_5fcase_17',['swap_case',['../namespacepcs.html#ac6e0b881e35c04e9b5bbe6e8b17ee1a7',1,'pcs']]], - ['swapcase_18',['swapcase',['../classpcs_1_1_cpp_string_t.html#a6ab02b4d1c8093a5dfc089a45427f63c',1,'pcs::CppStringT']]] + ['operator_22_22_5fcs_0',['operator""_cs',['../namespacepcs.html#afb8dd890fe893aba3264ac7df4fe7124',1,'pcs::operator""_cs(const char *str, std::size_t len)'],['../namespacepcs.html#acb7395de8ef88696d0c8c9772e172118',1,'pcs::operator""_cs(const wchar_t *str, std::size_t len)']]], + ['operator_28_29_1',['operator()',['../classpcs_1_1_cpp_string_t.html#a1fa8862a5f306553d6f0dae7e76fce83',1,'pcs::CppStringT::operator()(Slice< IntT > slice) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a0daec57ccab4601f46e9d1c258407765',1,'pcs::CppStringT::operator()(const long long start, const long long stop, const long long step=1) const noexcept']]], + ['operator_2a_2',['operator*',['../classpcs_1_1_cpp_string_t.html#a0995f5b5a01af3f4a749949e23d0d780',1,'pcs::CppStringT::operator*()'],['../classpcs_1_1_slice.html#afa6b7dc85e796da20dd5933d49400996',1,'pcs::Slice::operator*() noexcept']]], + ['operator_2b_2b_3',['operator++',['../classpcs_1_1_slice.html#a79edb1eb4e6bce136f730d82f7afeaff',1,'pcs::Slice::operator++() noexcept'],['../classpcs_1_1_slice.html#aa3e4bcf5cfd5917cc10e0641030984c2',1,'pcs::Slice::operator++(int) noexcept']]], + ['operator_3d_4',['operator=',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#addccd32880c403ee20a6a8423d8d3f8b',1,'pcs::CppStringT::TransTable::operator=(const TransTable &) noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a3efc5aab74f3a0594a9e88562d57867d',1,'pcs::CppStringT::TransTable::operator=(TransTable &&) noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a4f1dd7fb1ede54aa662c808eb84cda41',1,'pcs::CppStringT::TransTable::operator=(const std::map< key_type, value_type > &trans_table) noexcept'],['../classpcs_1_1_cpp_string_t.html#a30e26a3082ad50d01c7d0d98cb9e9c37',1,'pcs::CppStringT::operator=(const CppStringT &) noexcept=default'],['../classpcs_1_1_cpp_string_t.html#a810a3a27ee7396f9c472648978327a76',1,'pcs::CppStringT::operator=(CppStringT &&) noexcept=default']]], + ['operator_5b_5d_5',['operator[]',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a90ac2a729fc715870e7f32ea9c6536f9',1,'pcs::CppStringT::TransTable']]] ]; diff --git a/cpp-strings/html/search/pages_0.js b/cpp-strings/html/search/pages_0.js index 99af3b7..7610c45 100644 --- a/cpp-strings/html/search/pages_0.js +++ b/cpp-strings/html/search/pages_0.js @@ -1,7 +1,8 @@ var searchData= [ - ['0_200_20224_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['0_201_200_200_20224_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['0_20224_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['07_3',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]] + ['0_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['0_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['0_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['0_20229_202025_2007_3',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['07_4',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] ]; diff --git a/cpp-strings/html/search/pages_1.js b/cpp-strings/html/search/pages_1.js index 62e1d20..e34236a 100644 --- a/cpp-strings/html/search/pages_1.js +++ b/cpp-strings/html/search/pages_1.js @@ -1,5 +1,6 @@ var searchData= [ - ['1_200_200_20224_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['1_200_201_200_200_20224_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]] + ['1_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['1_200_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['1_200_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] ]; diff --git a/cpp-strings/html/search/pages_2.js b/cpp-strings/html/search/pages_2.js index dcd0f07..48bd79f 100644 --- a/cpp-strings/html/search/pages_2.js +++ b/cpp-strings/html/search/pages_2.js @@ -1,5 +1,5 @@ var searchData= [ - ['2025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['224_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]] + ['2025_2007_0',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] ]; diff --git a/cpp-strings/html/search/pages_3.js b/cpp-strings/html/search/pages_3.js index 7f76b9f..10a6632 100644 --- a/cpp-strings/html/search/pages_3.js +++ b/cpp-strings/html/search/pages_3.js @@ -1,4 +1,5 @@ var searchData= [ - ['cpp_20string_0',['Library cpp-string',['../index.html',1,'']]] + ['as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] ]; diff --git a/cpp-strings/html/search/pages_4.js b/cpp-strings/html/search/pages_4.js index 9b31960..8c2e7e6 100644 --- a/cpp-strings/html/search/pages_4.js +++ b/cpp-strings/html/search/pages_4.js @@ -1,4 +1,5 @@ var searchData= [ - ['intro_0',['Intro',['../index.html#autotoc_md3',1,'']]] + ['c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['cpp_20strings_1',['Library cpp-strings',['../index.html',1,'']]] ]; diff --git a/cpp-strings/html/search/pages_5.js b/cpp-strings/html/search/pages_5.js index 8d04a7a..534d42d 100644 --- a/cpp-strings/html/search/pages_5.js +++ b/cpp-strings/html/search/pages_5.js @@ -1,6 +1,4 @@ var searchData= [ - ['latest_20release_20release_201_200_201_200_200_20224_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['library_20cpp_20string_1',['Library cpp-string',['../index.html',1,'']]], - ['license_2',['License',['../index.html#autotoc_md2',1,'']]] + ['documentation_0',['Documentation',['../index.html#autotoc_md9',1,'']]] ]; diff --git a/cpp-strings/html/search/pages_6.js b/cpp-strings/html/search/pages_6.js index cae10e1..8ecbd2d 100644 --- a/cpp-strings/html/search/pages_6.js +++ b/cpp-strings/html/search/pages_6.js @@ -1,5 +1,4 @@ var searchData= [ - ['release_201_200_201_200_200_20224_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]], - ['release_20release_201_200_201_200_200_20224_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.224) 2025/07',['../index.html#autotoc_md5',1,'']]] + ['easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] ]; diff --git a/cpp-strings/html/search/pages_7.js b/cpp-strings/html/search/pages_7.js index ca7cc1e..bf51d68 100644 --- a/cpp-strings/html/search/pages_7.js +++ b/cpp-strings/html/search/pages_7.js @@ -1,4 +1,6 @@ var searchData= [ - ['string_0',['Library cpp-string',['../index.html',1,'']]] + ['if_20c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['in_20release_201_200_1',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['intro_2',['Intro',['../index.html#autotoc_md4',1,'']]] ]; diff --git a/cpp-strings/html/search/pages_8.js b/cpp-strings/html/search/pages_8.js new file mode 100644 index 0000000..767d0b6 --- /dev/null +++ b/cpp-strings/html/search/pages_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['latest_20release_20release_201_200_201_200_200_20229_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['library_20cpp_20strings_1',['Library cpp-strings',['../index.html',1,'']]], + ['license_2',['License',['../index.html#autotoc_md3',1,'']]] +]; diff --git a/cpp-strings/html/search/pages_9.js b/cpp-strings/html/search/pages_9.js new file mode 100644 index 0000000..87ae8b8 --- /dev/null +++ b/cpp-strings/html/search/pages_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['missing_20parts_20in_20release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]] +]; diff --git a/cpp-strings/html/search/pages_a.js b/cpp-strings/html/search/pages_a.js new file mode 100644 index 0000000..9f2f1fe --- /dev/null +++ b/cpp-strings/html/search/pages_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['parts_20in_20release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/cpp-strings/html/search/pages_b.js b/cpp-strings/html/search/pages_b.js new file mode 100644 index 0000000..1768d4f --- /dev/null +++ b/cpp-strings/html/search/pages_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], + ['release_201_200_201_200_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['release_20release_201_200_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] +]; diff --git a/cpp-strings/html/search/pages_c.js b/cpp-strings/html/search/pages_c.js new file mode 100644 index 0000000..95cc349 --- /dev/null +++ b/cpp-strings/html/search/pages_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['strings_0',['strings',['../index.html',1,'Library cpp-strings'],['../index.html#autotoc_md1',1,'What if c++ strings where as easy to use as Python strings?']]], + ['strings_20where_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/cpp-strings/html/search/pages_d.js b/cpp-strings/html/search/pages_d.js new file mode 100644 index 0000000..4f92957 --- /dev/null +++ b/cpp-strings/html/search/pages_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/cpp-strings/html/search/pages_e.js b/cpp-strings/html/search/pages_e.js new file mode 100644 index 0000000..4c7a727 --- /dev/null +++ b/cpp-strings/html/search/pages_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/cpp-strings/html/search/pages_f.js b/cpp-strings/html/search/pages_f.js new file mode 100644 index 0000000..a833894 --- /dev/null +++ b/cpp-strings/html/search/pages_f.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['what_20if_20c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['where_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] +]; diff --git a/cpp-strings/html/search/searchdata.js b/cpp-strings/html/search/searchdata.js index 29b4eb8..bf2a899 100644 --- a/cpp-strings/html/search/searchdata.js +++ b/cpp-strings/html/search/searchdata.js @@ -1,11 +1,11 @@ var indexSectionsWithContent = { - 0: "012bcefgijlnoprstuz~", + 0: "012abcdefgijlmnoprstuwz~", 1: "cnst", 2: "p", 3: "bcefgijloprstuz~", 4: "c", - 5: "012cilrs" + 5: "012acdeilmprstuw" }; var indexSectionNames = From ff9268ba552cfbb914f4d22fa7035d084908a1aa Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Thu, 17 Jul 2025 00:35:38 +0200 Subject: [PATCH 19/31] #228-modify README.md Fixed path to html documentation. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 46173ad..5fe6f86 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Library **cpp-strings** is fully templated. Just download header file `cppstring * Class `pcs::CppString` specializes the templated class with `char` characters. * Class `pcs::CppWString` specializes the templated class with `wchar_t` characters. -The **cpp-strings** HTML documentation is available here: [html/index.html](html/index.html). +The cpp-strings **HTML documentation** is available here: [cpp-strings/html/index.html](cpp-strings/html/index.html). Library **cpp-strings** is implemented with the currently most recent c++ standard available with gcc, clang and msvc c++ compilers, i.e. standard **c++20**. @@ -99,7 +99,7 @@ N.B. "*planned for a next release*" does not imply that a fixed date is planned --- ## Documentation -The **cpp-strings** HTML documentation is available here: [html/index.html](html/index.html). +The **cpp-strings** HTML documentation is available here: [cpp-strings/html/index.html](cpp-strings/html/index.html). It has then been produced with the great utility **doxygen** developed by Vicente Hernando (the doxygen Github repository can be accessed [here](https://github.com/doxygen/doxygen), and the utility can be downloaded from there: [https://www.doxygen.nl/download.html](https://www.doxygen.nl/download.html)). From 7d02c29aef7b3dc9960cc4321849b4890191d7d3 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Thu, 17 Jul 2025 00:44:01 +0200 Subject: [PATCH 20/31] #228-modify README.md A fix attempt to browse HTML documentation. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5fe6f86..4a0ca60 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Library **cpp-strings** is fully templated. Just download header file `cppstring * Class `pcs::CppString` specializes the templated class with `char` characters. * Class `pcs::CppWString` specializes the templated class with `wchar_t` characters. -The cpp-strings **HTML documentation** is available here: [cpp-strings/html/index.html](cpp-strings/html/index.html). +The cpp-strings **HTML documentation** is available here: [cpp-strings/html/index.html](https://github.com/schmouk/pythonic-cpp-strings/cpp-strings/html/index.html). Library **cpp-strings** is implemented with the currently most recent c++ standard available with gcc, clang and msvc c++ compilers, i.e. standard **c++20**. @@ -99,7 +99,7 @@ N.B. "*planned for a next release*" does not imply that a fixed date is planned --- ## Documentation -The **cpp-strings** HTML documentation is available here: [cpp-strings/html/index.html](cpp-strings/html/index.html). +The **cpp-strings** HTML documentation is available in subdirectory `cpp-strings/html`. Click on file `index.html` there from your file manager to browse its content or click [here]](https://github.com/schmouk/pythonic-cpp-strings/cpp-strings/html/index.html) when being currently browsing from [https://schmouk.github.io/pythonic-cpp-strings/](https://schmouk.github.io/pythonic-cpp-strings/). It has then been produced with the great utility **doxygen** developed by Vicente Hernando (the doxygen Github repository can be accessed [here](https://github.com/doxygen/doxygen), and the utility can be downloaded from there: [https://www.doxygen.nl/download.html](https://www.doxygen.nl/download.html)). From badfbfb39c38e79be82765256ce27b9cf41dcb39 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Thu, 17 Jul 2025 00:45:00 +0200 Subject: [PATCH 21/31] #228-modify README.md Fixed a typo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4a0ca60..2b59c52 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ N.B. "*planned for a next release*" does not imply that a fixed date is planned --- ## Documentation -The **cpp-strings** HTML documentation is available in subdirectory `cpp-strings/html`. Click on file `index.html` there from your file manager to browse its content or click [here]](https://github.com/schmouk/pythonic-cpp-strings/cpp-strings/html/index.html) when being currently browsing from [https://schmouk.github.io/pythonic-cpp-strings/](https://schmouk.github.io/pythonic-cpp-strings/). +The **cpp-strings** HTML documentation is available in subdirectory `cpp-strings/html`. Click on file `index.html` there from your file manager to browse its content or click [here](https://github.com/schmouk/pythonic-cpp-strings/cpp-strings/html/index.html) when being currently browsing from [https://schmouk.github.io/pythonic-cpp-strings/](https://schmouk.github.io/pythonic-cpp-strings/). It has then been produced with the great utility **doxygen** developed by Vicente Hernando (the doxygen Github repository can be accessed [here](https://github.com/doxygen/doxygen), and the utility can be downloaded from there: [https://www.doxygen.nl/download.html](https://www.doxygen.nl/download.html)). From afadeea45bed42b9f60af7edf1e3ef70429bfa08 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Thu, 17 Jul 2025 00:55:40 +0200 Subject: [PATCH 22/31] #228-modify README.md Fixed HTML documentation access. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2b59c52..c4db1ad 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Library **cpp-strings** is fully templated. Just download header file `cppstring * Class `pcs::CppString` specializes the templated class with `char` characters. * Class `pcs::CppWString` specializes the templated class with `wchar_t` characters. -The cpp-strings **HTML documentation** is available here: [cpp-strings/html/index.html](https://github.com/schmouk/pythonic-cpp-strings/cpp-strings/html/index.html). +The cpp-strings **HTML documentation** is available in subdirectory `cpp-strings/html`. Click on file `index.html` there from your local file manager to browse its content. Library **cpp-strings** is implemented with the currently most recent c++ standard available with gcc, clang and msvc c++ compilers, i.e. standard **c++20**. @@ -99,7 +99,7 @@ N.B. "*planned for a next release*" does not imply that a fixed date is planned --- ## Documentation -The **cpp-strings** HTML documentation is available in subdirectory `cpp-strings/html`. Click on file `index.html` there from your file manager to browse its content or click [here](https://github.com/schmouk/pythonic-cpp-strings/cpp-strings/html/index.html) when being currently browsing from [https://schmouk.github.io/pythonic-cpp-strings/](https://schmouk.github.io/pythonic-cpp-strings/). +The **cpp-strings** HTML documentation is available in subdirectory `cpp-strings/html`. Click on file `index.html` there from your local file manager to browse its content. It has then been produced with the great utility **doxygen** developed by Vicente Hernando (the doxygen Github repository can be accessed [here](https://github.com/doxygen/doxygen), and the utility can be downloaded from there: [https://www.doxygen.nl/download.html](https://www.doxygen.nl/download.html)). From ca5fea544c7315918f7d1c30735a35732948b260 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Thu, 17 Jul 2025 00:58:23 +0200 Subject: [PATCH 23/31] #204-create PCS documentation Fixed HTML documentation access. --- cpp-strings/html/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp-strings/html/index.html b/cpp-strings/html/index.html index 38594be..528fc62 100644 --- a/cpp-strings/html/index.html +++ b/cpp-strings/html/index.html @@ -101,7 +101,7 @@

  • Class pcs::CppString specializes the templated class with char characters.
  • Class pcs::CppWString specializes the templated class with wchar_t characters.
  • -

    The cpp-strings HTML documentation is available here: html/index.html.

    +

    The cpp-strings HTML documentation is available in subdirectory cpp-strings/html. Click on file index.html there from your local file manager to browse its content.

    Library cpp-strings is implemented with the currently most recent c++ standard available with gcc, clang and msvc c++ compilers, i.e. standard c++20.

    • directory cpp-strings contains the header file cppstring.h.
      @@ -171,7 +171,7 @@


      Documentation

      -

      The cpp-strings HTML documentation is available here: html/index.html.

      +

      The cpp-strings HTML documentation is available in subdirectory cpp-strings/html. Click on file index.html there from your local file manager to browse its content.

      It has then been produced with the great utility doxygen developed by Vicente Hernando (the doxygen Github repository can be accessed here, and the utility can be downloaded from there: https://www.doxygen.nl/download.html).

      This is a short documentation of the library. For some of its part it is a copy of the Python original documentation on strings. For its other part it documents the c++ implementation of cpp-strings.

      And remember: to better understand how to use this pythonic c++ strings library, have a look also at cpp-strings-tests/cpp-strings-tests.cpp to see cpp-strings library code in action!

      From abea7a0ac449d2797918a2b3e1fb2168a64ab9b8 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Fri, 26 Sep 2025 14:54:28 +0200 Subject: [PATCH 24/31] #232-Release version 1.0.2 Fixed erroneous numbering of release in some header. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c4db1ad..ad0d3c4 100644 --- a/README.md +++ b/README.md @@ -74,9 +74,9 @@ This `.cpp` file is a great place to see **cpp-strings** code in action. Each st --- -## Latest Release - Release 1.0 (1.0.0.229) 2025/07 +## Latest Release - Release 1.0 (1.0.2.232) 2025/07 -The coding of this project started by March 2023 and had been put in standby mode for some months - no time to work on it. The very first release is now availble (since July 2025), as **Release 1.0**. +The coding of this project started by March 2023 and had been put in standby mode for some months - no time to work on it. The very first release is now availble (since July 2025), as **Release 1.0.2**. This release has been fully tested. Code coverage is 100%. From 7b3b884190f96710e70fd1aabf45211197068968 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Tue, 21 Oct 2025 14:45:22 +0200 Subject: [PATCH 25/31] #235-fix README.md typos fixed one main typo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad0d3c4..7f3d098 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Library cpp-strings [![license](http://img.shields.io/github/license/schmouk/pythonic-cpp-strings.svg?style=plastic&labelColor=blueviolet&color=lightblue)](https://github.com/schmouk/pythonic-cpp-strings/license) [![Latest release](http://img.shields.io/github/release/schmouk/pythonic-cpp-strings.svg?style=plastic&labelColor=blueviolet&color=success)](https://github.com/schmouk/pythonic-cpp-strings/releases) [![code_coverage](https://img.shields.io/badge/code_coverage-100%25-success?style=plastic&labelColor=blueviolet)]() [![tests](https://img.shields.io/badge/tests-passing-success?style=plastic&labelColor=blueviolet)]() -### What if c++ strings where as easy to use as Python strings? +### What if c++ strings were as easy to use as Python strings? Let's just use c++ strings as are Python ones, with same API or as similar API as possible. Library **cpp-strings** is fully templated. Just download header file `cppstrings.h` and put it anywhere in your project. Notice: all of its stuff is declared and defined in namespace `pcs` - which stands for **P**ythonic **C**++ **S**trings. From e3f163c895648e6f0fc2a52ff8e773b0ac13cdee Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Tue, 21 Oct 2025 15:14:22 +0200 Subject: [PATCH 26/31] #236-add banner image for library --- banner-image.jpg | Bin 0 -> 248957 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 banner-image.jpg diff --git a/banner-image.jpg b/banner-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b341f4490fabd39d05c3e483b3a5ad65589f2ec GIT binary patch literal 248957 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�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

      (?;? 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újKTWETO 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

      q}6SZZFQs}3?KFt9GN3JLma0I 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 wC1HK5Drr5i1cjVTW4}N_lyvD6 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 G{rNx2Rl!*R literal 0 HcmV?d00001 From 2fa67bfc5b41d8fd0d9065013cdf90e3e4cc49c7 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Tue, 21 Oct 2025 15:20:57 +0200 Subject: [PATCH 27/31] #235-fix README.md typos Added banner image. Modfiied header text. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f3d098..6a1925a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# Library cpp-strings +Library banner + [![license](http://img.shields.io/github/license/schmouk/pythonic-cpp-strings.svg?style=plastic&labelColor=blueviolet&color=lightblue)](https://github.com/schmouk/pythonic-cpp-strings/license) [![Latest release](http://img.shields.io/github/release/schmouk/pythonic-cpp-strings.svg?style=plastic&labelColor=blueviolet&color=success)](https://github.com/schmouk/pythonic-cpp-strings/releases) [![code_coverage](https://img.shields.io/badge/code_coverage-100%25-success?style=plastic&labelColor=blueviolet)]() [![tests](https://img.shields.io/badge/tests-passing-success?style=plastic&labelColor=blueviolet)]() ### What if c++ strings were as easy to use as Python strings? From b394a1f2fc1ebe4686ed84a2df0960701e7954ec Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Tue, 21 Oct 2025 18:39:37 +0200 Subject: [PATCH 28/31] #234-remove any source file from doxygen documentation Completed. --- cpp-strings/cpp-strings.cfg => cpp-strings.cfg | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) rename cpp-strings/cpp-strings.cfg => cpp-strings.cfg (92%) diff --git a/cpp-strings/cpp-strings.cfg b/cpp-strings.cfg similarity index 92% rename from cpp-strings/cpp-strings.cfg rename to cpp-strings.cfg index 847ae88..84af6c7 100644 --- a/cpp-strings/cpp-strings.cfg +++ b/cpp-strings.cfg @@ -27,7 +27,7 @@ # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "cpp-strings" -PROJECT_NUMBER = "1.0.0" +PROJECT_NUMBER = "1.0.4" PROJECT_BRIEF = "Pythonic c++ strings" OUTPUT_DIRECTORY = @@ -58,9 +58,9 @@ WARN_NO_PARAMDOC = NO #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = ./ ../ +INPUT = ./cpp-strings INPUT_ENCODING = UTF-8 -USE_MDFILE_AS_MAINPAGE = ../README.md +USE_MDFILE_AS_MAINPAGE = ./README.md #--------------------------------------------------------------------------- # Configuration options related to source browsing @@ -72,7 +72,7 @@ REFERENCES_RELATION = YES # Configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES -HTML_OUTPUT = html +HTML_OUTPUT = ./documentation HTML_FILE_EXTENSION = .html HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_SAT = 100 @@ -89,6 +89,11 @@ EXT_LINKS_IN_WINDOW = NO SEARCHENGINE = YES SERVER_BASED_SEARCH = NO EXTERNAL_SEARCH = NO +SORT_GROUP_NAMES = YES +SOURCE_BROWSER = NO +VERBATIM_HEADERS = NO +WARN_IF_INCOMPLETE_DOC = NO +WARN_IF_UNDOCUMENTED = NO #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output From 95181061fb316cdae2422ae94f955f25c5692994 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Tue, 21 Oct 2025 18:40:23 +0200 Subject: [PATCH 29/31] #232-Fix README.md erroneous naming of last release Fixed. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6a1925a..68fc199 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Library banner +[Library banner] [![license](http://img.shields.io/github/license/schmouk/pythonic-cpp-strings.svg?style=plastic&labelColor=blueviolet&color=lightblue)](https://github.com/schmouk/pythonic-cpp-strings/license) [![Latest release](http://img.shields.io/github/release/schmouk/pythonic-cpp-strings.svg?style=plastic&labelColor=blueviolet&color=success)](https://github.com/schmouk/pythonic-cpp-strings/releases) [![code_coverage](https://img.shields.io/badge/code_coverage-100%25-success?style=plastic&labelColor=blueviolet)]() [![tests](https://img.shields.io/badge/tests-passing-success?style=plastic&labelColor=blueviolet)]() @@ -75,9 +75,9 @@ This `.cpp` file is a great place to see **cpp-strings** code in action. Each st --- -## Latest Release - Release 1.0 (1.0.2.232) 2025/07 +## Latest Release - Release 1.0 (1.0.4 - 2025/10) -The coding of this project started by March 2023 and had been put in standby mode for some months - no time to work on it. The very first release is now availble (since July 2025), as **Release 1.0.2**. +The coding of this project started by March 2023 and had been put in standby mode for some months - no time to work on it. The very first release is now availble (since July 2025), as **Release 1.0.4**. This release has been fully tested. Code coverage is 100%. @@ -100,7 +100,7 @@ N.B. "*planned for a next release*" does not imply that a fixed date is planned --- ## Documentation -The **cpp-strings** HTML documentation is available in subdirectory `cpp-strings/html`. Click on file `index.html` there from your local file manager to browse its content. +The **cpp-strings** HTML documentation is available in subdirectory `./documentation`. Click on file `index.html` there from your local file manager to browse its content. It has then been produced with the great utility **doxygen** developed by Vicente Hernando (the doxygen Github repository can be accessed [here](https://github.com/doxygen/doxygen), and the utility can be downloaded from there: [https://www.doxygen.nl/download.html](https://www.doxygen.nl/download.html)). From 0c4844365dcb33ff85cdd61b814b480eb0fdcea3 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Tue, 21 Oct 2025 18:40:58 +0200 Subject: [PATCH 30/31] #233-rename documentation directory Fixed. --- cpp-strings/cppstrings.h | 26 +- cpp-strings/html/cppstrings_8h_source.html | 2231 ----------------- cpp-strings/html/files_dup.js | 4 - cpp-strings/html/index.html | 190 -- cpp-strings/html/index.js | 10 - cpp-strings/html/navtreeindex1.js | 105 - cpp-strings/html/search/all_0.js | 8 - cpp-strings/html/search/all_1.js | 6 - cpp-strings/html/search/all_10.js | 7 - cpp-strings/html/search/all_15.js | 5 - cpp-strings/html/search/all_2.js | 5 - cpp-strings/html/search/all_3.js | 5 - cpp-strings/html/search/all_5.js | 16 - cpp-strings/html/search/all_6.js | 4 - cpp-strings/html/search/all_a.js | 52 - cpp-strings/html/search/all_d.js | 4 - cpp-strings/html/search/pages_0.js | 8 - cpp-strings/html/search/pages_1.js | 6 - cpp-strings/html/search/pages_2.js | 5 - cpp-strings/html/search/pages_3.js | 5 - cpp-strings/html/search/pages_4.js | 5 - cpp-strings/html/search/pages_5.js | 4 - cpp-strings/html/search/pages_6.js | 4 - cpp-strings/html/search/pages_7.js | 6 - cpp-strings/html/search/pages_8.js | 6 - cpp-strings/html/search/pages_9.js | 4 - cpp-strings/html/search/pages_a.js | 5 - cpp-strings/html/search/pages_b.js | 6 - cpp-strings/html/search/pages_c.js | 5 - cpp-strings/html/search/pages_d.js | 4 - cpp-strings/html/search/pages_e.js | 4 - cpp-strings/html/search/pages_f.js | 5 - .../html => documentation}/annotated.html | 2 +- .../html => documentation}/annotated_dup.js | 0 .../html => documentation}/classes.html | 2 +- .../classpcs_1_1_cpp_string_t-members.html | 2 +- .../classpcs_1_1_cpp_string_t.html | 16 +- .../classpcs_1_1_cpp_string_t.js | 0 .../classpcs_1_1_cpp_string_t.png | Bin ...ing_t_1_1_not_found_exception-members.html | 2 +- ..._cpp_string_t_1_1_not_found_exception.html | 4 +- ...1_cpp_string_t_1_1_not_found_exception.png | Bin ..._cpp_string_t_1_1_trans_table-members.html | 2 +- ...spcs_1_1_cpp_string_t_1_1_trans_table.html | 6 +- ...asspcs_1_1_cpp_string_t_1_1_trans_table.js | 0 .../classpcs_1_1_slice-members.html | 2 +- .../classpcs_1_1_slice.html | 6 +- .../classpcs_1_1_slice.js | 0 .../classpcs_1_1_slice.png | Bin .../html => documentation}/clipboard.js | 0 {cpp-strings/html => documentation}/cookie.js | 0 .../dir_04560ed86add89973319438dcdff07f6.html | 21 +- .../html => documentation}/doxygen.css | 2 +- .../html => documentation}/doxygen.svg | 0 .../html => documentation}/doxygen_crawl.html | 9 +- .../html => documentation}/dynsections.js | 0 .../html => documentation}/functions.html | 2 +- .../functions_func.html | 2 +- .../html => documentation}/hierarchy.html | 2 +- .../html => documentation}/hierarchy.js | 0 documentation/index.html | 103 + {cpp-strings/html => documentation}/jquery.js | 0 {cpp-strings/html => documentation}/menu.js | 0 .../html => documentation}/menudata.js | 4 +- .../namespacemembers.html | 2 +- .../namespacemembers_func.html | 2 +- .../namespacemembers_type.html | 2 +- .../html => documentation}/namespacepcs.html | 2 +- .../html => documentation}/namespacepcs.js | 0 .../html => documentation}/namespaces.html | 2 +- .../html => documentation}/namespaces_dup.js | 0 .../html => documentation}/navtree.css | 0 .../html => documentation}/navtree.js | 0 .../html => documentation}/navtreedata.js | 4 - .../html => documentation}/navtreeindex0.js | 254 +- documentation/navtreeindex1.js | 96 + .../all_4.js => documentation/search/all_0.js | 0 documentation/search/all_1.js | 14 + .../search/all_10.js | 0 .../html => documentation}/search/all_11.js | 6 +- .../html => documentation}/search/all_12.js | 4 +- .../html => documentation}/search/all_13.js | 2 +- documentation/search/all_14.js | 5 + documentation/search/all_15.js | 5 + .../html => documentation}/search/all_16.js | 0 .../search/all_17.js | 0 .../search/all_2.js | 0 .../all_8.js => documentation/search/all_3.js | 0 .../all_9.js => documentation/search/all_4.js | 0 .../search/all_5.js | 0 .../all_b.js => documentation/search/all_6.js | 0 .../search/all_7.js | 0 .../all_e.js => documentation/search/all_8.js | 0 .../all_f.js => documentation/search/all_9.js | 0 documentation/search/all_a.js | 5 + .../search/all_b.js | 0 documentation/search/all_c.js | 21 + documentation/search/all_d.js | 12 + .../search/all_e.js | 0 .../search/all_f.js | 0 .../search/classes_0.js | 0 .../search/classes_1.js | 0 .../search/classes_2.js | 0 .../search/classes_3.js | 0 .../search/functions_0.js | 0 .../search/functions_1.js | 0 .../search/functions_2.js | 9 +- .../search/functions_3.js | 0 .../search/functions_4.js | 0 documentation/search/functions_5.js | 49 + .../search/functions_6.js | 0 .../search/functions_7.js | 9 +- .../search/functions_8.js | 0 .../search/functions_9.js | 0 documentation/search/functions_a.js | 14 + .../search/functions_b.js | 0 .../search/functions_c.js | 0 .../search/functions_d.js | 3 +- documentation/search/functions_e.js | 4 + documentation/search/functions_f.js | 11 + .../search/namespaces_0.js | 0 documentation/search/pages_0.js | 7 + documentation/search/pages_1.js | 6 + documentation/search/pages_2.js | 6 + documentation/search/pages_3.js | 5 + documentation/search/pages_4.js | 4 + documentation/search/pages_5.js | 4 + documentation/search/pages_6.js | 4 + documentation/search/pages_7.js | 6 + documentation/search/pages_8.js | 5 + documentation/search/pages_9.js | 4 + documentation/search/pages_a.js | 5 + documentation/search/pages_b.js | 6 + documentation/search/pages_c.js | 5 + documentation/search/pages_d.js | 4 + documentation/search/pages_e.js | 4 + documentation/search/pages_f.js | 5 + .../html => documentation}/search/search.css | 0 .../html => documentation}/search/search.js | 0 .../search/searchdata.js | 11 +- .../search/typedefs_0.js | 0 .../structpcs_1_1_start_slice-members.html | 2 +- .../structpcs_1_1_start_slice.html | 6 +- .../structpcs_1_1_start_slice.js | 0 .../structpcs_1_1_start_slice.png | Bin ...tructpcs_1_1_start_step_slice-members.html | 2 +- .../structpcs_1_1_start_step_slice.html | 6 +- .../structpcs_1_1_start_step_slice.js | 0 .../structpcs_1_1_start_step_slice.png | Bin ...tructpcs_1_1_start_stop_slice-members.html | 2 +- .../structpcs_1_1_start_stop_slice.html | 6 +- .../structpcs_1_1_start_stop_slice.js | 0 .../structpcs_1_1_start_stop_slice.png | Bin .../structpcs_1_1_step_slice-members.html | 2 +- .../structpcs_1_1_step_slice.html | 6 +- .../structpcs_1_1_step_slice.js | 0 .../structpcs_1_1_step_slice.png | Bin .../structpcs_1_1_stop_slice-members.html | 2 +- .../structpcs_1_1_stop_slice.html | 6 +- .../structpcs_1_1_stop_slice.js | 0 .../structpcs_1_1_stop_slice.png | Bin ...structpcs_1_1_stop_step_slice-members.html | 2 +- .../structpcs_1_1_stop_step_slice.html | 6 +- .../structpcs_1_1_stop_step_slice.js | 0 .../structpcs_1_1_stop_step_slice.png | Bin {cpp-strings/html => documentation}/tabs.css | 0 166 files changed, 646 insertions(+), 2979 deletions(-) delete mode 100644 cpp-strings/html/cppstrings_8h_source.html delete mode 100644 cpp-strings/html/files_dup.js delete mode 100644 cpp-strings/html/index.html delete mode 100644 cpp-strings/html/index.js delete mode 100644 cpp-strings/html/navtreeindex1.js delete mode 100644 cpp-strings/html/search/all_0.js delete mode 100644 cpp-strings/html/search/all_1.js delete mode 100644 cpp-strings/html/search/all_10.js delete mode 100644 cpp-strings/html/search/all_15.js delete mode 100644 cpp-strings/html/search/all_2.js delete mode 100644 cpp-strings/html/search/all_3.js delete mode 100644 cpp-strings/html/search/all_5.js delete mode 100644 cpp-strings/html/search/all_6.js delete mode 100644 cpp-strings/html/search/all_a.js delete mode 100644 cpp-strings/html/search/all_d.js delete mode 100644 cpp-strings/html/search/pages_0.js delete mode 100644 cpp-strings/html/search/pages_1.js delete mode 100644 cpp-strings/html/search/pages_2.js delete mode 100644 cpp-strings/html/search/pages_3.js delete mode 100644 cpp-strings/html/search/pages_4.js delete mode 100644 cpp-strings/html/search/pages_5.js delete mode 100644 cpp-strings/html/search/pages_6.js delete mode 100644 cpp-strings/html/search/pages_7.js delete mode 100644 cpp-strings/html/search/pages_8.js delete mode 100644 cpp-strings/html/search/pages_9.js delete mode 100644 cpp-strings/html/search/pages_a.js delete mode 100644 cpp-strings/html/search/pages_b.js delete mode 100644 cpp-strings/html/search/pages_c.js delete mode 100644 cpp-strings/html/search/pages_d.js delete mode 100644 cpp-strings/html/search/pages_e.js delete mode 100644 cpp-strings/html/search/pages_f.js rename {cpp-strings/html => documentation}/annotated.html (99%) rename {cpp-strings/html => documentation}/annotated_dup.js (100%) rename {cpp-strings/html => documentation}/classes.html (99%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t-members.html (99%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t.html (99%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t.js (100%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t.png (100%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t_1_1_not_found_exception-members.html (99%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html (98%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t_1_1_not_found_exception.png (100%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html (99%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t_1_1_trans_table.html (99%) rename {cpp-strings/html => documentation}/classpcs_1_1_cpp_string_t_1_1_trans_table.js (100%) rename {cpp-strings/html => documentation}/classpcs_1_1_slice-members.html (99%) rename {cpp-strings/html => documentation}/classpcs_1_1_slice.html (99%) rename {cpp-strings/html => documentation}/classpcs_1_1_slice.js (100%) rename {cpp-strings/html => documentation}/classpcs_1_1_slice.png (100%) rename {cpp-strings/html => documentation}/clipboard.js (100%) rename {cpp-strings/html => documentation}/cookie.js (100%) rename cpp-strings/html/files.html => documentation/dir_04560ed86add89973319438dcdff07f6.html (85%) rename {cpp-strings/html => documentation}/doxygen.css (99%) rename {cpp-strings/html => documentation}/doxygen.svg (100%) rename {cpp-strings/html => documentation}/doxygen_crawl.html (98%) rename {cpp-strings/html => documentation}/dynsections.js (100%) rename {cpp-strings/html => documentation}/functions.html (99%) rename {cpp-strings/html => documentation}/functions_func.html (99%) rename {cpp-strings/html => documentation}/hierarchy.html (99%) rename {cpp-strings/html => documentation}/hierarchy.js (100%) create mode 100644 documentation/index.html rename {cpp-strings/html => documentation}/jquery.js (100%) rename {cpp-strings/html => documentation}/menu.js (100%) rename {cpp-strings/html => documentation}/menudata.js (96%) rename {cpp-strings/html => documentation}/namespacemembers.html (99%) rename {cpp-strings/html => documentation}/namespacemembers_func.html (99%) rename {cpp-strings/html => documentation}/namespacemembers_type.html (99%) rename {cpp-strings/html => documentation}/namespacepcs.html (99%) rename {cpp-strings/html => documentation}/namespacepcs.js (100%) rename {cpp-strings/html => documentation}/namespaces.html (99%) rename {cpp-strings/html => documentation}/namespaces_dup.js (100%) rename {cpp-strings/html => documentation}/navtree.css (100%) rename {cpp-strings/html => documentation}/navtree.js (100%) rename {cpp-strings/html => documentation}/navtreedata.js (94%) rename {cpp-strings/html => documentation}/navtreeindex0.js (86%) create mode 100644 documentation/navtreeindex1.js rename cpp-strings/html/search/all_4.js => documentation/search/all_0.js (100%) create mode 100644 documentation/search/all_1.js rename cpp-strings/html/search/all_17.js => documentation/search/all_10.js (100%) rename {cpp-strings/html => documentation}/search/all_11.js (86%) rename {cpp-strings/html => documentation}/search/all_12.js (92%) rename {cpp-strings/html => documentation}/search/all_13.js (95%) create mode 100644 documentation/search/all_14.js create mode 100644 documentation/search/all_15.js rename {cpp-strings/html => documentation}/search/all_16.js (100%) rename cpp-strings/html/search/functions_f.js => documentation/search/all_17.js (100%) rename cpp-strings/html/search/functions_2.js => documentation/search/all_2.js (100%) rename cpp-strings/html/search/all_8.js => documentation/search/all_3.js (100%) rename cpp-strings/html/search/all_9.js => documentation/search/all_4.js (100%) rename cpp-strings/html/search/functions_5.js => documentation/search/all_5.js (100%) rename cpp-strings/html/search/all_b.js => documentation/search/all_6.js (100%) rename cpp-strings/html/search/functions_7.js => documentation/search/all_7.js (100%) rename cpp-strings/html/search/all_e.js => documentation/search/all_8.js (100%) rename cpp-strings/html/search/all_f.js => documentation/search/all_9.js (100%) create mode 100644 documentation/search/all_a.js rename cpp-strings/html/search/functions_a.js => documentation/search/all_b.js (100%) create mode 100644 documentation/search/all_c.js create mode 100644 documentation/search/all_d.js rename cpp-strings/html/search/functions_d.js => documentation/search/all_e.js (100%) rename cpp-strings/html/search/functions_e.js => documentation/search/all_f.js (100%) rename {cpp-strings/html => documentation}/search/classes_0.js (100%) rename {cpp-strings/html => documentation}/search/classes_1.js (100%) rename {cpp-strings/html => documentation}/search/classes_2.js (100%) rename {cpp-strings/html => documentation}/search/classes_3.js (100%) rename {cpp-strings/html => documentation}/search/functions_0.js (100%) rename {cpp-strings/html => documentation}/search/functions_1.js (100%) rename cpp-strings/html/search/all_7.js => documentation/search/functions_2.js (77%) rename {cpp-strings/html => documentation}/search/functions_3.js (100%) rename {cpp-strings/html => documentation}/search/functions_4.js (100%) create mode 100644 documentation/search/functions_5.js rename {cpp-strings/html => documentation}/search/functions_6.js (100%) rename cpp-strings/html/search/all_c.js => documentation/search/functions_7.js (50%) rename {cpp-strings/html => documentation}/search/functions_8.js (100%) rename {cpp-strings/html => documentation}/search/functions_9.js (100%) create mode 100644 documentation/search/functions_a.js rename {cpp-strings/html => documentation}/search/functions_b.js (100%) rename {cpp-strings/html => documentation}/search/functions_c.js (100%) rename cpp-strings/html/search/all_14.js => documentation/search/functions_d.js (65%) create mode 100644 documentation/search/functions_e.js create mode 100644 documentation/search/functions_f.js rename {cpp-strings/html => documentation}/search/namespaces_0.js (100%) create mode 100644 documentation/search/pages_0.js create mode 100644 documentation/search/pages_1.js create mode 100644 documentation/search/pages_2.js create mode 100644 documentation/search/pages_3.js create mode 100644 documentation/search/pages_4.js create mode 100644 documentation/search/pages_5.js create mode 100644 documentation/search/pages_6.js create mode 100644 documentation/search/pages_7.js create mode 100644 documentation/search/pages_8.js create mode 100644 documentation/search/pages_9.js create mode 100644 documentation/search/pages_a.js create mode 100644 documentation/search/pages_b.js create mode 100644 documentation/search/pages_c.js create mode 100644 documentation/search/pages_d.js create mode 100644 documentation/search/pages_e.js create mode 100644 documentation/search/pages_f.js rename {cpp-strings/html => documentation}/search/search.css (100%) rename {cpp-strings/html => documentation}/search/search.js (100%) rename {cpp-strings/html => documentation}/search/searchdata.js (68%) rename {cpp-strings/html => documentation}/search/typedefs_0.js (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_slice-members.html (99%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_slice.html (98%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_slice.js (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_slice.png (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_step_slice-members.html (99%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_step_slice.html (98%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_step_slice.js (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_step_slice.png (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_stop_slice-members.html (99%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_stop_slice.html (98%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_stop_slice.js (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_start_stop_slice.png (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_step_slice-members.html (99%) rename {cpp-strings/html => documentation}/structpcs_1_1_step_slice.html (98%) rename {cpp-strings/html => documentation}/structpcs_1_1_step_slice.js (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_step_slice.png (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_stop_slice-members.html (99%) rename {cpp-strings/html => documentation}/structpcs_1_1_stop_slice.html (98%) rename {cpp-strings/html => documentation}/structpcs_1_1_stop_slice.js (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_stop_slice.png (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_stop_step_slice-members.html (99%) rename {cpp-strings/html => documentation}/structpcs_1_1_stop_step_slice.html (98%) rename {cpp-strings/html => documentation}/structpcs_1_1_stop_step_slice.js (100%) rename {cpp-strings/html => documentation}/structpcs_1_1_stop_step_slice.png (100%) rename {cpp-strings/html => documentation}/tabs.css (100%) diff --git a/cpp-strings/cppstrings.h b/cpp-strings/cppstrings.h index e368f9f..82f275e 100644 --- a/cpp-strings/cppstrings.h +++ b/cpp-strings/cppstrings.h @@ -835,7 +835,7 @@ namespace pcs // i.e. "pythonic c++ strings" * * Decimal characters are those that can be used to form numbers in * base 10, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal - * character is a character in the Unicode General Category “Nd”. + * character is a character in the Unicode General Category �Nd�. */ [[nodiscard]] inline const bool isdecimal() const noexcept @@ -883,7 +883,7 @@ namespace pcs // i.e. "pythonic c++ strings" * the currently implemented rule is this simpler one: * * identifier ::= ID_Start id_continue* - * id_continue ::= ID_Start | + * id_continue ::= ID_Start | decimal_number */ [[nodiscard]] inline const bool isidentifier() const noexcept @@ -1654,18 +1654,18 @@ namespace pcs // i.e. "pythonic c++ strings" * Line breaks are not included in the resulting list unless keepends is given and true. * * This method splits on the following line boundaries. In particular, the boundaries are a superset of universal newlines: - * \n Line Feed - * \r Carriage Return - * \r\n Carriage Return + Line Feed - * \v or \x0b Line Tabulation - * \f or \x0c Form Feed - * \x1c File Separator - * \x1d Group Separator - * \x1e Record Separator + * '\n' Line Feed + * '\r' Carriage Return + * '\r\n' Carriage Return + Line Feed + * '\v' or '\x0b' Line Tabulation + * '\f' or '\x0c' Form Feed + * '\x1c' File Separator + * '\x1d' Group Separator + * '\x1e' Record Separator * Next separators values, detected by Python method splitlines(), are currently NOT detected by CppStrings - * \x85 Next Line (C1 Control Code) - * \u2028 Line Separator - * \u2029 Paragraph Separator + * '\x85' Next Line (C1 Control Code) + * '\u2028' Line Separator + * '\u2029' Paragraph Separator */ [[nodiscard]] std::vector splitlines(const bool keep_end = false) const noexcept diff --git a/cpp-strings/html/cppstrings_8h_source.html b/cpp-strings/html/cppstrings_8h_source.html deleted file mode 100644 index 6f058ee..0000000 --- a/cpp-strings/html/cppstrings_8h_source.html +++ /dev/null @@ -1,2231 +0,0 @@ - - - - - - - -cpp-strings: cppstrings.h Source File - - - - - - - - - - - - - - -

      -
      - -
      -
      -
      - -
      -
      - -
      -
      - - -
      -
      -
      -
      -
      -
      Loading...
      -
      Searching...
      -
      No Matches
      -
      -
      -
      -
      - -
      -
      cppstrings.h
      -
      -
      -
      1#pragma once
      -
      22
      -
      23//=============================================================
      -
      24#include <algorithm>
      -
      25#include <array>
      -
      26#include <cassert>
      -
      27#include <cctype>
      -
      28#include <cwctype>
      -
      29#include <format>
      -
      30#include <limits>
      -
      31#include <map>
      -
      32#include <ranges>
      -
      33#include <span>
      -
      34#include <stdexcept>
      -
      35#include <type_traits>
      -
      36#include <vector>
      -
      37
      -
      38
      -
      39
      -
      40namespace pcs // i.e. "pythonic c++ strings"
      -
      41{
      -
      42 //=============================================================
      -
      43 // Forward declarations
      -
      44
      -
      45 // base class -- not to be directly instantiated, see belowing specializations instead
      -
      46 template<
      -
      47 class CharT,
      -
      48 class TraitsT = std::char_traits<CharT>,
      -
      49 class AllocatorT = std::allocator<CharT>
      -
      50 > class CppStringT;
      -
      51
      -
      52 // specializations of the base class -- these are the ones that should be instantiated by user.
      - - -
      55
      -
      56
      -
      57#if defined(_MSC_VER)
      -
      58# pragma warning(push)
      -
      59# pragma warning(disable: 4455) // to avoid boring warnings with litteral operators definitions
      -
      60#endif
      -
      61
      -
      62 // litteral operators
      -
      63 inline CppString operator""_cs(const char* str, std::size_t len);
      -
      64 inline CppWString operator""_cs(const wchar_t* str, std::size_t len);
      -
      65
      -
      66
      -
      67 // slices -- to be used with operator CppStringT::operator().
      -
      68 template<typename IntT = std::int64_t>
      -
      69 requires std::is_signed_v<IntT>
      -
      70 class Slice;
      -
      71
      -
      72 template<typename IntT = std::int64_t>
      -
      73 requires std::is_signed_v<IntT>
      -
      74 struct StartSlice;
      -
      75
      -
      76 template<typename IntT = std::int64_t>
      -
      77 requires std::is_signed_v<IntT>
      -
      78 struct StopSlice;
      -
      79
      -
      80 template<typename IntT = std::int64_t>
      -
      81 requires std::is_signed_v<IntT>
      -
      82 struct StepSlice;
      -
      83
      -
      84 template<typename IntT = std::int64_t>
      -
      85 requires std::is_signed_v<IntT>
      -
      86 struct StartStopSlice;
      -
      87
      -
      88 template<typename IntT = std::int64_t>
      -
      89 requires std::is_signed_v<IntT>
      -
      90 struct StartStepSlice;
      -
      91
      -
      92 template<typename IntT = std::int64_t>
      -
      93 requires std::is_signed_v<IntT>
      -
      94 struct StopStepSlice;
      -
      95
      -
      96
      -
      97 // chars classifications -- not to be directly called, see respective specializations at the very end of this module.
      -
      98 template<class CharT>
      -
      99 inline const bool is_alpha(const CharT ch) noexcept;
      -
      100
      -
      101 template<class CharT>
      -
      102 inline const bool is_ascii(const CharT ch) noexcept;
      -
      103
      -
      104 template<class CharT>
      -
      105 inline const bool is_decimal(const CharT ch) noexcept;
      -
      106
      -
      107 template<class CharT>
      -
      108 inline const bool is_digit(const CharT ch) noexcept;
      -
      109
      -
      110 template<class CharT>
      -
      111 inline const bool is_id_continue(const CharT ch) noexcept;
      -
      112
      -
      113 template<class CharT>
      -
      114 inline const bool is_id_start(const CharT ch) noexcept;
      -
      115
      -
      116 template<class CharT>
      -
      117 inline const bool is_lower(const CharT ch) noexcept;
      -
      118
      -
      119 template<class CharT>
      -
      120 inline const bool is_numeric(const CharT ch) noexcept;
      -
      121
      -
      122 template<class CharT>
      -
      123 inline const bool is_printable(const CharT ch) noexcept;
      -
      124
      -
      125 template<class CharT>
      -
      126 inline const bool is_punctuation(const CharT ch) noexcept;
      -
      127
      -
      128 template<class CharT>
      -
      129 inline const bool is_space(const CharT ch) noexcept;
      -
      130
      -
      131 template<class CharT>
      -
      132 inline const bool is_upper(const CharT ch) noexcept;
      -
      133
      -
      134 template<class CharT>
      -
      135 inline const CharT swap_case(const CharT ch) noexcept;
      -
      136
      -
      137 template<class CharT>
      -
      138 inline const CharT to_lower(const CharT ch) noexcept;
      -
      139
      -
      140 template<class CharT>
      -
      141 inline const CharT to_upper(const CharT ch) noexcept;
      -
      142
      -
      143
      -
      144 //===== CppStringT<> ======================================
      -
      164 template<class CharT, class TraitsT, class AllocatorT>
      -
      165 class CppStringT : public std::basic_string<CharT, TraitsT, AllocatorT>
      -
      166 {
      -
      167 public:
      -
      168 //=== Wrappers ========================================
      -
      169 using MyBaseClass = std::basic_string<CharT, TraitsT, AllocatorT>;
      -
      170
      -
      171 using traits_type = MyBaseClass::traits_type;
      -
      172 using value_type = MyBaseClass::value_type;
      -
      173 using allocator_type = MyBaseClass::allocator_type;
      -
      174 using size_type = MyBaseClass::size_type;
      -
      175 using difference_type = MyBaseClass::difference_type;
      -
      176 using reference = MyBaseClass::reference;
      -
      177 using const_reference = MyBaseClass::const_reference;
      -
      178 using pointer = MyBaseClass::pointer;
      -
      179 using const_pointer = MyBaseClass::const_pointer;
      -
      180 using iterator = MyBaseClass::iterator;
      -
      181 using const_iterator = MyBaseClass::const_iterator;
      -
      182 using reverse_iterator = MyBaseClass::reverse_iterator;
      -
      183 using const_reverse_iterator = MyBaseClass::const_reverse_iterator;
      -
      184
      -
      185
      -
      186 //=== Translation Table ===============================
      - -
      189 {
      -
      190 public:
      -
      191 //--- wrappers ------------------------------------
      -
      192 using key_type = CharT;
      -
      193 using value_type = CppStringT;
      -
      194
      -
      195 //--- Constructors / destructor -------------------
      -
      197 inline TransTable(const std::map<key_type, value_type> trans_table)
      -
      198 : m_table{ trans_table }
      -
      199 {}
      -
      200
      -
      207 TransTable(const CppStringT& keys, const CppStringT& values)
      -
      208 {
      -
      209 assert(keys.size() == values.size());
      -
      210 auto val_it = values.cbegin();
      -
      211 for (const auto k : keys)
      -
      212 m_table[k] = CppStringT(*val_it++);
      -
      213 }
      -
      214
      -
      223 TransTable(const CppStringT& keys, const CppStringT& values, const CppStringT& not_translated)
      -
      224 {
      -
      225 assert(keys.size() == values.size());
      -
      226 auto val_it = values.cbegin();
      -
      227 for (const auto k : keys)
      -
      228 m_table[k] = CppStringT(*val_it++);
      -
      229 for (const auto k : not_translated)
      -
      230 m_table[k] = CppStringT();
      -
      231 }
      -
      232
      -
      239 inline TransTable(const CppStringT& keys, const std::initializer_list<CppStringT>& values)
      -
      240 {
      -
      241 assert(keys.size() == values.size());
      -
      242 auto val_it = values.begin();
      -
      243 for (const auto k : keys)
      -
      244 m_table[k] = *val_it++;
      -
      245 }
      -
      246
      -
      255 inline TransTable(const CppStringT& keys, const std::initializer_list<CppStringT> values, const CppStringT& not_translated)
      -
      256 {
      -
      257 assert(keys.size() == values.size());
      -
      258 auto val_it = values.begin();
      -
      259 for (const auto k : keys)
      -
      260 m_table[k] = *val_it++;
      -
      261 for (const auto k : not_translated)
      -
      262 m_table[k] = CppStringT();
      -
      263 }
      -
      264
      -
      271 inline TransTable(const CharT* keys, const CharT* values)
      -
      272 {
      -
      273 while (*keys && *values)
      -
      274 m_table[*keys++] = value_type(*values++);
      -
      275 }
      -
      276
      -
      285 inline TransTable(const CharT* keys, const CharT* values, const CharT* not_translated)
      -
      286 {
      -
      287 while (*keys && *values)
      -
      288 m_table[*keys++] = value_type(*values++);
      -
      289 while (*not_translated)
      -
      290 m_table[*not_translated++] = CppStringT();
      -
      291 }
      -
      292
      -
      299 template<class KeyIt, class ValueIt>
      -
      300 inline TransTable(KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)
      -
      301 {
      -
      302 KeyIt key_it{ first_key };
      -
      303 ValueIt val_it{ first_value };
      -
      304 while (key_it != last_key && val_it != last_value)
      -
      305 m_table[*key_it++] = value_type(*val_it++);
      -
      306 }
      -
      307
      -
      316 template<class Key1It, class ValueIt, class Key2It>
      -
      317 inline TransTable(Key1It first_key, Key1It last_key,
      -
      318 ValueIt first_value, ValueIt last_value,
      -
      319 Key2It first_not_translated, Key2It last_not_translated)
      -
      320 {
      -
      321 Key1It key1_it{ first_key };
      -
      322 ValueIt val_it{ first_value };
      -
      323 while (key1_it != last_key && val_it != last_value)
      -
      324 m_table[*key1_it++] = value_type(*val_it++);
      -
      325 Key2It key2_it{ first_not_translated };
      -
      326 while (key2_it != last_not_translated)
      -
      327 m_table[*key2_it++] = CppStringT();
      -
      328 }
      -
      329
      -
      336 /**/
      -
      337 template<class StringViewLike>
      -
      338 explicit TransTable(const StringViewLike& keys, const StringViewLike& values)
      -
      339 {
      -
      340 assert(keys.size() == values.size());
      -
      341 auto val_it = values.cbegin();
      -
      342 for (const auto k : keys)
      -
      343 m_table[(*k)[0]] = value_type(*val_it++);
      -
      344 }
      -
      345
      -
      346 inline TransTable() noexcept = default;
      -
      347 inline TransTable(const TransTable&) noexcept = default;
      -
      348 inline TransTable(TransTable&&) noexcept = default;
      -
      349
      -
      350 inline ~TransTable() noexcept = default;
      -
      351
      -
      352 //--- operators -----------------------------------
      -
      353 inline TransTable& operator= (const TransTable&) noexcept = default;
      -
      354 inline TransTable& operator= (TransTable&&) noexcept = default;
      -
      355
      -
      357 inline TransTable& operator= (const std::map<key_type, value_type>& trans_table) noexcept
      -
      358 {
      -
      359 m_table = trans_table;
      -
      360 return *this;
      -
      361 }
      -
      362
      -
      364 [[nodiscard]]
      -
      365 inline value_type operator[] (const key_type ch) noexcept
      -
      366 {
      -
      367 auto it = m_table.find(ch);
      -
      368 if (it != m_table.end()) [[likely]] {
      -
      369 return it->second;
      -
      370 }
      -
      371 else [[unlikely]] {
      -
      372 return ch;
      -
      373 }
      -
      374 }
      -
      375
      -
      376 inline std::map<typename key_type, typename value_type>& get_table() noexcept
      -
      377 {
      -
      378 return m_table;
      -
      379 }
      -
      380
      -
      381 private:
      -
      382 std::map<typename key_type, typename value_type> m_table{}; // the internal storage of the translation table. Access it via the indexing operator.
      -
      383
      -
      384 };
      -
      385
      -
      386
      -
      387 //=== Constructors / Destructor =======================
      -
      388 inline CppStringT() : MyBaseClass() {} // #1
      -
      389 inline CppStringT(const CppStringT& other) : MyBaseClass(other) {} // #2
      -
      390 inline CppStringT(const CppStringT& other, const AllocatorT& alloc) : MyBaseClass(other, alloc) {} // #3
      -
      391 inline CppStringT(CppStringT&& other) noexcept : MyBaseClass(other) {} // #4
      -
      392 inline CppStringT(CppStringT&& other, const AllocatorT& alloc) noexcept : MyBaseClass(other, alloc) {} // #5
      -
      393 inline CppStringT(MyBaseClass::size_type count, CharT ch) : MyBaseClass(count, ch) {} // #6
      -
      394 inline CppStringT(const CppStringT& other, size_type pos) : MyBaseClass(other, pos) {} // #7
      -
      395 inline CppStringT(const CppStringT& other, size_type pos, size_type count) noexcept : MyBaseClass(other, pos, count) {} // #8
      -
      396 inline CppStringT(const CharT* s) // #9
      -
      397 : MyBaseClass(s ? s : CppStringT().c_str())
      -
      398 {}
      -
      399 inline CppStringT(const CharT* s, size_type count) // #10
      -
      400 : MyBaseClass(s ? s : CppStringT().c_str(), count)
      -
      401 {}
      -
      402 inline CppStringT(std::initializer_list<CharT> ilist) : MyBaseClass(ilist) {} // #11
      -
      403
      -
      404 inline CppStringT(const CharT ch) : MyBaseClass(1, ch) {} // #19
      -
      405
      -
      406 inline CppStringT(const MyBaseClass& other) : MyBaseClass(other) {} // #12
      -
      407 inline CppStringT(const MyBaseClass& other, const AllocatorT& alloc) : MyBaseClass(other, alloc) {} // #13
      -
      408 inline CppStringT(MyBaseClass&& other) : MyBaseClass(other) {} // #14
      -
      409 inline CppStringT(MyBaseClass&& other, const AllocatorT& alloc) : MyBaseClass(other, alloc) {} // #15
      -
      410
      -
      411 template<class InputIt>
      -
      412 inline CppStringT(InputIt first, InputIt last) : MyBaseClass(first, last) {} // #16
      -
      413
      -
      414 template<class StringViewLike>
      -
      415 explicit CppStringT(StringViewLike& svl) : MyBaseClass(svl) {} // #17
      -
      416
      -
      417 template<class StringViewLike>
      -
      418 CppStringT(StringViewLike& svl, size_type pos, size_type n) : MyBaseClass(svl, pos, n) {} // #18
      -
      419
      -
      420 inline ~CppStringT() noexcept = default;
      -
      421
      -
      422
      -
      423 //=== Assignment operators ============================
      -
      424 CppStringT& operator= (const CppStringT&) noexcept = default;
      -
      425 CppStringT& operator= (CppStringT&&) noexcept = default;
      -
      426
      -
      427
      -
      428 //=== Exceptions ======================================
      -
      429 class NotFoundException : public std::logic_error
      -
      430 {
      -
      431 public:
      -
      432 using MyBaseClass = std::logic_error;
      -
      433
      -
      434 inline NotFoundException(const std::string& what_arg) : MyBaseClass(what_arg) {}
      -
      435 inline NotFoundException(const char* what_arg) : MyBaseClass(what_arg) {}
      -
      436 };
      -
      437
      -
      438
      -
      439 //=== Methods =========================================
      -
      440
      -
      441 //--- capitalize() ------------------------------------
      -
      443 inline CppStringT capitalize() noexcept
      -
      444 {
      -
      445 CppStringT res(*this);
      -
      446 if (!res.empty()) [[likely]] {
      -
      447 res.lower();
      -
      448 res[0] = pcs::to_upper(res[0]);
      -
      449 }
      -
      450 return res;
      -
      451 }
      -
      452
      -
      453
      -
      454 //--- center() ----------------------------------------
      -
      461 [[nodiscard]]
      -
      462 CppStringT center(const size_type width, const value_type fillch = value_type(' ')) const noexcept
      -
      463 {
      -
      464 const size_type len{ this->size() };
      -
      465 if (width <= len) [[unlikely]]
      -
      466 return CppStringT(*this);
      -
      467
      -
      468 const size_type half{ (width - len) / 2 };
      -
      469 return CppStringT(half, fillch) + *this + CppStringT(width - half - len, fillch);
      -
      470 }
      -
      471
      -
      472
      -
      473 //--- contains() --------------------------------------
      -
      478 [[nodiscard]]
      -
      479 constexpr bool contains(const CppStringT& substr) const noexcept
      -
      480 {
      -
      481 if (substr.empty()) [[unlikely]]
      -
      482 // the empty string is always contained in any string
      -
      483 return true;
      -
      484
      -
      485#if (defined(_HAS_CXX23) && _HAS_CXX23) || (!defined(_HAS_CXX23) && __cplusplus >= 202302L)
      -
      486 // c++23 and above already defines this method
      -
      487 return MyBaseClass::contains(substr);
      -
      488#else
      -
      489 // up to c++20, we have to implement this method
      -
      490 const size_type substr_width{ substr.size() };
      -
      491 const size_type width{ this->size() };
      -
      492
      -
      493 if (substr_width > width) [[unlikely]]
      -
      494 return false;
      -
      495
      -
      496 for (size_type index = 0; index <= width - substr_width; ++index) [[likely]] {
      -
      497 if (substr == this->substr(index, substr_width))
      -
      498 return true;
      -
      499 }
      -
      500
      -
      501 return false;
      -
      502#endif
      -
      503 }
      -
      504
      -
      505
      -
      506 //--- contains_n() ------------------------------------
      -
      511 [[nodiscard]]
      -
      512 inline constexpr bool contains_n(const CppStringT& sub, const size_type start, const size_type count = -1) const noexcept
      -
      513 {
      -
      514 try {
      -
      515 return this->substr(start, count).contains(sub);
      -
      516 }
      -
      517 catch (...) {
      -
      518 return false;
      -
      519 }
      -
      520 }
      -
      521
      -
      522
      -
      523 //--- count() -----------------------------------------
      -
      525 [[nodiscard]]
      -
      526 constexpr size_type count(const CppStringT& sub, const size_type start = 0, const size_type end = -1) const noexcept
      -
      527 {
      -
      528 size_type n = 0;
      -
      529 CppStringT tmp{ this->substr(start, std::min(this->size(), end) - start + 1) };
      -
      530
      -
      531 size_type start_{ 0 };
      -
      532 size_type end_{ tmp.size() };
      -
      533
      -
      534 while ((start_ = tmp.find(sub, start_, end_)) != CppStringT::npos) {
      -
      535 start_ += sub.size();
      -
      536 end_ -= start_;
      -
      537 tmp = tmp.substr(start_, std::min(tmp.size(), end_) + 1);
      -
      538 start_ = 0;
      -
      539 n++;
      -
      540 }
      -
      541
      -
      542 return n;
      -
      543 }
      -
      544
      -
      545
      -
      546 //--- count_n() ---------------------------------------
      -
      548 [[nodiscard]]
      -
      549 inline constexpr size_type count_n(const CppStringT& sub, const size_type start, const size_type length) const noexcept
      -
      550 {
      -
      551 return count(sub, start, start + length - 1);
      -
      552 }
      -
      553
      -
      555 [[nodiscard]]
      -
      556 inline constexpr size_type count_n(const CppStringT& sub, const size_type length) const noexcept
      -
      557 {
      -
      558 return count(sub, 0, length - 1);
      -
      559 }
      -
      560
      -
      561
      -
      562 //--- endswith() --------------------------------------
      -
      564 [[nodiscard]]
      -
      565 inline const bool endswith(const CppStringT& suffix, const size_type start, const size_type end) const noexcept
      -
      566 {
      -
      567 return this->substr(start, end - start + 1).MyBaseClass::ends_with(suffix);
      -
      568 }
      -
      569
      -
      571 [[nodiscard]]
      -
      572 inline const bool endswith(const CppStringT& suffix, const size_type end) const noexcept
      -
      573 {
      -
      574 return this->substr(0, end).MyBaseClass::ends_with(suffix);
      -
      575 }
      -
      576
      -
      578 [[nodiscard]]
      -
      579 inline const bool endswith(const CppStringT& suffix) const noexcept
      -
      580 {
      -
      581 return static_cast<const bool>(MyBaseClass::ends_with(suffix));
      -
      582 }
      -
      583
      -
      585 [[nodiscard]]
      -
      586 const bool endswith(const std::initializer_list<CppStringT>& suffixes, const size_type start, const size_type end) const noexcept
      -
      587 {
      -
      588 if (start > end) [[unlikely]]
      -
      589 return false;
      -
      590
      -
      591 CppStringT tmp(this->substr(start, end - start + 1));
      -
      592 for (auto& suffix : suffixes) {
      -
      593 if (tmp.ends_with(suffix)) [[unlikely]]
      -
      594 return true;
      -
      595 }
      -
      596 return false;
      -
      597 }
      -
      598
      -
      599
      -
      600 //--- endswith_n() ------------------------------------
      -
      602 [[nodiscard]]
      -
      603 inline const bool endswith_n(const CppStringT& suffix, const size_type start, const size_type count) const noexcept
      -
      604 {
      -
      605 return endswith(suffix, start, start + count - 1);
      -
      606 }
      -
      607
      -
      609 [[nodiscard]]
      -
      610 inline const bool endswith_n(const CppStringT& suffix, const size_type count) const noexcept
      -
      611 {
      -
      612 return endswith(suffix, 0, count - 1);
      -
      613 }
      -
      614
      -
      616 [[nodiscard]]
      -
      617 inline const bool endswith_n(const std::initializer_list<CppStringT>& suffixes, const size_type start, const size_type count) const noexcept
      -
      618 {
      -
      619 return endswith(suffixes, start, start + count - 1);
      -
      620 }
      -
      621
      -
      622
      -
      623 //--- expand_tabs() -----------------------------------
      -
      625 [[nodiscard]]
      -
      626 CppStringT expand_tabs(const size_type tabsize = 8) const noexcept
      -
      627 {
      -
      628 const size_type tabsize_{ tabsize == 0 ? 1 : tabsize };
      -
      629 CppStringT ret{};
      -
      630
      -
      631 std::size_t current_pos{ 0 };
      -
      632 for (const value_type ch : *this) {
      -
      633 if (ch == value_type('\t')) [[unlikely]] {
      -
      634 do {
      -
      635 ret += value_type(' ');
      -
      636 current_pos++;
      -
      637 } while (current_pos % tabsize_ != 0);
      -
      638 }
      -
      639 else if (ch == value_type('\n') || ch == value_type('\r')) [[unlikely]] {
      -
      640 ret += ch;
      -
      641 current_pos = 0;
      -
      642 }
      -
      643 else [[likely]] {
      -
      644 ret += ch;
      -
      645 current_pos++;
      -
      646 }
      -
      647 }
      -
      648
      -
      649 return ret;
      -
      650 }
      -
      651
      -
      652
      -
      653 //--- find() ------------------------------------------
      -
      665 [[nodiscard]]
      -
      666 constexpr size_type find(const CppStringT& sub, const size_type start = 0, const size_type end = -1) const noexcept
      -
      667 {
      -
      668 const size_type end_{ (end == -1) ? this->size() : end };
      -
      669
      -
      670 if (start > end_) [[unlikely]]
      -
      671 return CppStringT::npos;
      -
      672 else [[likely]]
      -
      673 return find_n(sub, start, end_ - start + 1);
      -
      674 }
      -
      675
      -
      676
      -
      677 //--- find_n() ----------------------------------------
      -
      690 [[nodiscard]]
      -
      691 inline constexpr size_type find_n(const CppStringT& sub, const size_type start, const size_type count) const noexcept
      -
      692 {
      -
      693 constexpr size_type npos{ CppStringT::npos };
      -
      694
      -
      695 try {
      -
      696 const CppStringT sub_str{ this->substr(start, count) };
      -
      697 const size_type found_pos{ sub_str.MyBaseClass::find(sub) };
      -
      698
      -
      699 return (found_pos == npos) ? npos : found_pos + start;
      -
      700 }
      -
      701 catch (...) {
      -
      702 return npos;
      -
      703 }
      -
      704 }
      -
      705
      -
      718 [[nodiscard]]
      -
      719 inline constexpr size_type find_n(const CppStringT& sub, const size_type count) const noexcept
      -
      720 {
      -
      721 return find_n(sub, 0, count);
      -
      722 }
      -
      723
      -
      724
      -
      725 //--- format() ----------------------------------------
      -
      727 template<typename T, class... ArgsT>
      -
      728 inline CppStringT& format(
      -
      729 const std::basic_format_string<T, std::type_identity_t<ArgsT>...> frmt,
      -
      730 ArgsT&&... args
      -
      731 )
      -
      732 {
      -
      733 return *this;
      -
      734 }
      -
      735
      -
      736 template<class... ArgsT>
      -
      737 inline CppStringT& format(
      -
      738 const std::basic_format_string<char , std::type_identity_t<ArgsT>... > frmt,
      -
      739 ArgsT&&... args
      -
      740 )
      -
      741 {
      -
      742 return *this = std::vformat(frmt.get(), std::make_format_args(args...));
      -
      743 }
      -
      744
      -
      745 template<class... ArgsT>
      -
      746 inline CppStringT& format(
      -
      747 const std::basic_format_string<wchar_t, std::type_identity_t<ArgsT>... > frmt,
      -
      748 ArgsT&&... args
      -
      749 )
      -
      750 {
      -
      751 return *this = std::vformat(frmt.get(), std::make_wformat_args(args...));
      -
      752 }
      -
      753
      -
      754
      -
      755 //--- index() -----------------------------------------
      -
      761 [[nodiscard]]
      -
      762 inline constexpr size_type index(const CppStringT& sub, const size_type start = 0, const size_type end = -1) const
      -
      763 {
      -
      764 const size_type ret_value = find(sub, start, end);
      -
      765 if (ret_value == CppStringT::npos)
      -
      766 throw NotFoundException("substring not found in string.");
      -
      767 else
      -
      768 return ret_value;
      -
      769 }
      -
      770
      -
      771
      -
      772 //--- index_n() ---------------------------------------
      -
      778 [[nodiscard]]
      -
      779 inline constexpr size_type index_n(const CppStringT& sub, const size_type start, const size_type count) const
      -
      780 {
      -
      781 return index(sub, start, start + count - 1);
      -
      782 }
      -
      783
      -
      789 [[nodiscard]]
      -
      790 inline constexpr size_type index_n(const CppStringT& sub, const size_type count) const
      -
      791 {
      -
      792 return index(sub, 0, count);
      -
      793 }
      -
      794
      -
      795
      -
      796 //--- isalnum() ---------------------------------------
      -
      798 [[nodiscard]]
      -
      799 inline const bool isalnum() const noexcept
      -
      800 {
      -
      801 if (this->empty()) [[unlikely]]
      -
      802 return false;
      -
      803 else [[likely]]
      -
      804 return std::all_of(
      -
      805 this->cbegin(),
      -
      806 this->cend(),
      -
      807 [](const value_type ch) { return pcs::is_alpha(ch) || pcs::is_decimal(ch) || pcs::is_digit(ch) || pcs::is_numeric(ch); }
      -
      808 );
      -
      809 }
      -
      810
      -
      811
      -
      812 //--- isalpha() --------------------------------------
      -
      814 [[nodiscard]]
      -
      815 inline const bool isalpha() const noexcept
      -
      816 {
      -
      817 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_alpha<value_type>);
      -
      818 }
      -
      819
      -
      820
      -
      821 //--- isascii() ---------------------------------------
      -
      823#if defined(isascii) // may be already defined in header file <ctype.h>
      -
      824#undef isascii
      -
      825#endif
      -
      826 [[nodiscard]]
      -
      827 inline const bool isascii() const noexcept
      -
      828 {
      -
      829 return this->empty() || std::all_of(this->cbegin(), this->cend(), pcs::is_ascii<value_type>);
      -
      830 }
      -
      831
      -
      832
      -
      833 //--- isdecimal() -------------------------------------
      -
      840 [[nodiscard]]
      -
      841 inline const bool isdecimal() const noexcept
      -
      842 {
      -
      843 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_decimal<value_type>);
      -
      844 }
      -
      845
      -
      846
      -
      847 //--- isdigit() ---------------------------------------
      -
      861 [[nodiscard]]
      -
      862 inline const bool isdigit() const noexcept
      -
      863 {
      -
      864 return isdecimal();
      -
      865 }
      -
      866
      -
      867
      -
      868 //--- isidentifier() ----------------------------------
      -
      888 [[nodiscard]]
      -
      889 inline const bool isidentifier() const noexcept
      -
      890 {
      -
      891 return !this->empty() && pcs::is_id_start((*this)[0]) && (this->size() == 1 || std::all_of(this->cbegin() + 1, this->cend(), pcs::is_id_continue<value_type>));
      -
      892 }
      -
      893
      -
      894
      -
      895 //--- islower() ---------------------------------------
      -
      897 [[nodiscard]]
      -
      898 inline const bool islower() const noexcept
      -
      899 {
      -
      900 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_lower<value_type>);
      -
      901 }
      -
      902
      -
      903
      -
      904 //--- isnumeric() -------------------------------------
      -
      914 [[nodiscard]]
      -
      915 inline const bool isnumeric() const noexcept
      -
      916 {
      -
      917 return isdecimal();
      -
      918 }
      -
      919
      -
      920
      -
      921 //--- isprintable() -----------------------------------
      -
      928 [[nodiscard]]
      -
      929 inline const bool isprintable() const noexcept
      -
      930 {
      -
      931 return this->empty() || std::all_of(this->cbegin(), this->cend(), pcs::is_printable<value_type>);
      -
      932 }
      -
      933
      -
      934
      -
      935 //--- ispunctuation() ---------------------------------
      -
      937 [[nodiscard]]
      -
      938 inline const bool ispunctuation() const noexcept
      -
      939 {
      -
      940 return this->size() == 1 && pcs::is_punctuation((*this)[0]);
      -
      941 }
      -
      942
      -
      943
      -
      944 //--- isspace() ---------------------------------------
      -
      946 [[nodiscard]]
      -
      947 inline const bool isspace() const noexcept
      -
      948 {
      -
      949 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_space<value_type>);
      -
      950 }
      -
      951
      -
      952
      -
      953 //--- istitle() ---------------------------------------
      -
      963 [[nodiscard]]
      -
      964 inline const bool istitle() const noexcept
      -
      965 {
      -
      966 return !this->empty() && this->title() == *this;
      -
      967 }
      -
      968
      -
      969
      -
      970 //--- isupper() ---------------------------------------
      -
      972 [[nodiscard]]
      -
      973 inline const bool isupper() const noexcept
      -
      974 {
      -
      975 return !this->empty() && std::all_of(this->cbegin(), this->cend(), pcs::is_upper<value_type>);
      -
      976 }
      -
      977
      -
      978
      -
      979 //--- is_words_sep() ----------------------------------
      -
      981 [[nodiscard]]
      -
      982 inline const bool is_words_sep() const noexcept
      -
      983 {
      -
      984 return !this->empty() &&
      -
      985 std::all_of(
      -
      986 this->cbegin(),
      -
      987 this->cend(),
      -
      988 [](const value_type ch) { return pcs::is_space(ch) || pcs::is_punctuation(ch); }
      -
      989 );
      -
      990 }
      -
      991
      -
      992
      -
      993 //--- join() ------------------------------------------
      -
      998 template<const std::size_t N>
      -
      999 [[nodiscard]]
      -
      1000 CppStringT join(const std::array<CppStringT, N>& strs) const noexcept
      -
      1001 {
      -
      1002 if (strs.empty()) [[unlikely]]
      -
      1003 return CppStringT();
      -
      1004
      -
      1005 auto str_it = strs.cbegin();
      -
      1006 CppStringT res{ *str_it++ };
      -
      1007 while (str_it != strs.cend()) [[likely]]
      -
      1008 res += *this + *str_it++;
      -
      1009 return res;
      -
      1010 }
      -
      1011
      -
      1016 [[nodiscard]]
      -
      1017 CppStringT join(const std::vector<CppStringT>& strs) const noexcept
      -
      1018 {
      -
      1019 if (strs.empty()) [[unlikely]]
      -
      1020 return CppStringT();
      -
      1021
      -
      1022 auto str_it = strs.cbegin();
      -
      1023 CppStringT res{ *str_it++ };
      -
      1024 while (str_it != strs.cend()) [[likely]]
      -
      1025 res += *this + *str_it++;
      -
      1026 return res;
      -
      1027 }
      -
      1028
      -
      1033 template<class... NextCppStringsT>
      -
      1034 [[nodiscard]]
      -
      1035 inline CppStringT join(const CppStringT& first, const NextCppStringsT&... others) const noexcept
      -
      1036 requires (sizeof...(others) > 0)
      -
      1037 {
      -
      1038 return first + *this + this->join(others...);
      -
      1039 }
      -
      1040
      -
      1042 [[nodiscard]]
      -
      1043 inline CppStringT join(const CppStringT& s) const noexcept
      -
      1044 {
      -
      1045 return s;
      -
      1046 }
      -
      1047
      -
      1049 [[nodiscard]]
      -
      1050 inline const CppStringT join() const noexcept
      -
      1051 {
      -
      1052 return *this;
      -
      1053 }
      -
      1054
      -
      1055
      -
      1056 //--- ljust() -----------------------------------------
      -
      1062 [[nodiscard]]
      -
      1063 inline CppStringT ljust(const size_type width, const value_type fillch = value_type(' ')) const noexcept
      -
      1064 {
      -
      1065 if (this->size() >= width) [[unlikely]]
      -
      1066 return *this;
      -
      1067 else [[likely]]
      -
      1068 return CppStringT(width - this->size(), fillch) + *this;
      -
      1069 }
      -
      1070
      -
      1071
      -
      1072 //--- lower () -----------------------------------------
      -
      1078 inline CppStringT& lower() noexcept
      -
      1079 {
      -
      1080 std::transform(
      -
      1081 this->begin(),
      -
      1082 this->end(),
      -
      1083 this->begin(),
      -
      1084 [&](value_type ch) { return this->lower(ch); }
      -
      1085 );
      -
      1086 return *this;
      -
      1087 }
      -
      1088
      -
      1094 [[nodiscard]]
      -
      1095 static inline const value_type lower(const value_type ch) noexcept
      -
      1096 {
      -
      1097 return value_type(std::tolower(ch));
      -
      1098 }
      -
      1099
      -
      1100
      -
      1101 //--- lstrip() ----------------------------------------
      -
      1109 [[nodiscard]]
      -
      1110 inline CppStringT lstrip(const CppStringT& removedchars) const noexcept
      -
      1111 {
      -
      1112 for (auto it = this->cbegin(); it != this->cend(); ++it) [[likely]]
      -
      1113 if (std::none_of(removedchars.cbegin(), removedchars.cend(), [it](const value_type ch) { return *it == ch; })) [[likely]]
      -
      1114 return CppStringT(it, this->cend());
      -
      1115 return CppStringT();
      -
      1116 }
      -
      1117
      -
      1119 [[nodiscard]]
      -
      1120 inline CppStringT lstrip() const noexcept
      -
      1121 {
      -
      1122 for (auto it = this->cbegin(); it != this->cend(); ++it) [[likely]]
      -
      1123 if (*it != value_type(' ')) [[unlikely]]
      -
      1124 return CppStringT(it, this->cend());
      -
      1125 return CppStringT();
      -
      1126 }
      -
      1127
      -
      1128
      -
      1129 //--- operator () -------------------------------------
      -
      1141 template<typename IntT>
      -
      1142 requires std::is_signed_v<IntT>
      -
      1143 [[nodiscard]]
      -
      1144 CppStringT operator() (Slice<IntT> slice) const noexcept
      -
      1145 {
      -
      1146 // optimization on 1 by 1 step
      -
      1147 if (slice.step() == 1) [[likely]] {
      -
      1148 slice.begin(*this);
      -
      1149 if (slice.start() < slice.stop()) [[likely]]
      -
      1150 return this->substr(size_type(slice.start()), size_type(slice.stop() - slice.start() + 1));
      -
      1151 else [[unlikely]]
      -
      1152 return CppStringT();
      -
      1153 }
      -
      1154
      -
      1155 CppStringT res{};
      -
      1156
      -
      1157 // optimization on reversed 1 by 1 step
      -
      1158 if (slice.step() == -1) {
      -
      1159 slice.begin(*this);
      -
      1160 if (slice.stop() < slice.start()) [[likely]] {
      -
      1161 res = this->substr(size_type(slice.stop()), size_type(slice.start() - slice.stop() + 1));
      -
      1162 std::ranges::reverse(res); // notice: may use vectorization if available
      -
      1163 }
      -
      1164 return res;
      -
      1165 }
      -
      1166
      -
      1167 // finally, no trivial optimization -- and naive implementation...
      -
      1168 for (slice.begin(*this); !slice.end(); ++slice)
      -
      1169 res += (*this)[size_type(*slice)];
      -
      1170
      -
      1171 return res;
      -
      1172 }
      -
      1173
      -
      1175 [[nodiscard]]
      -
      1176 inline CppStringT operator() (const long long start, const long long stop, const long long step = 1) const noexcept
      -
      1177 {
      -
      1178 Slice<long long> slice(start, stop, step);
      -
      1179 return (*this)(slice);
      -
      1180 }
      -
      1181
      -
      1182
      -
      1183 //--- operator * --------------------------------------
      -
      1185 [[nodiscard]]
      -
      1186 CppStringT operator* (std::int64_t count) const noexcept
      -
      1187 {
      -
      1188 if (count <= 0) [[unlikely]]
      -
      1189 return CppStringT();
      -
      1190
      -
      1191 CppStringT res(*this);
      -
      1192 while (--count) [[likely]]
      -
      1193 res += *this;
      -
      1194 return res;
      -
      1195 }
      -
      1196
      -
      1197
      -
      1198 //--- partition() -------------------------------------
      -
      1204 [[nodiscard]]
      -
      1205 std::vector<CppStringT> partition(const CppStringT& sep) const noexcept
      -
      1206 {
      -
      1207 const size_type sep_index = find(sep);
      -
      1208 if (sep_index == CppStringT::npos) {
      -
      1209 const CppStringT empty{};
      -
      1210 return std::vector<CppStringT>({ *this, empty, empty });
      -
      1211 }
      -
      1212 else {
      -
      1213 const size_type third_index = sep_index + sep.size();
      -
      1214 const size_type third_size = this->size() - third_index + 1;
      -
      1215 return std::vector<CppStringT>({ this->substr(0, sep_index), sep, this->substr(third_index, third_size) });
      -
      1216 }
      -
      1217 }
      -
      1218
      -
      1219
      -
      1220 //--- removeprefix() ----------------------------------
      -
      1222 [[nodiscard]]
      -
      1223 inline CppStringT removeprefix(const CppStringT& prefix) const noexcept
      -
      1224 {
      -
      1225 if (this->startswith(prefix)) {
      -
      1226 const size_type prefix_length = prefix.size();
      -
      1227 return this->substr(prefix_length, this->size() - prefix_length + 1);
      -
      1228 }
      -
      1229 else
      -
      1230 return *this;
      -
      1231 }
      -
      1232
      -
      1233
      -
      1234 //--- removesuffix() ----------------------------------
      -
      1236 [[nodiscard]]
      -
      1237 inline CppStringT removesuffix(const CppStringT& suffix) const noexcept
      -
      1238 {
      -
      1239 if (this->endswith(suffix)) {
      -
      1240 const size_type suffix_length = suffix.size();
      -
      1241 return this->substr(0, this->size() - suffix_length);
      -
      1242 }
      -
      1243 else
      -
      1244 return *this;
      -
      1245 }
      -
      1246
      -
      1247
      -
      1248 //--- replace() ---------------------------------------
      -
      1250 [[nodiscard]]
      -
      1251 CppStringT replace(const CppStringT& old, const CppStringT& new_, size_type count = -1) const noexcept
      -
      1252 {
      -
      1253 if (old == new_ || old.empty()) [[unlikely]]
      -
      1254 return *this;
      -
      1255
      -
      1256 CppStringT res{};
      -
      1257 size_type prev_index = 0;
      -
      1258 size_type current_index = 0;
      -
      1259 while (count > 0 && (current_index = this->find(old, prev_index)) != CppStringT::npos) {
      -
      1260 res += this->substr(prev_index, current_index - prev_index) + new_;
      -
      1261 prev_index = current_index + 1;
      -
      1262 --count;
      -
      1263 }
      -
      1264
      -
      1265 if (prev_index < this->size()) [[likely]]
      -
      1266 res += this->substr(prev_index, this->size() - prev_index);
      -
      1267
      -
      1268 return res;
      -
      1269 }
      -
      1270
      -
      1271
      -
      1272 //--- rfind() -----------------------------------------
      -
      1287 [[nodiscard]]
      -
      1288 inline constexpr size_type rfind(const CppStringT& sub, const size_type start, const size_type end) const noexcept
      -
      1289 {
      -
      1290 if (start > end) [[unlikely]]
      -
      1291 return CppStringT::npos;
      -
      1292 else if (sub.empty()) [[unlikely]]
      -
      1293 return 0;
      -
      1294 else [[likely]] {
      -
      1295 const size_type found_pos{ this->substr(start, end - start + 1).rfind(sub) };
      -
      1296 return (found_pos == CppStringT::npos) ? CppStringT::npos : found_pos + start;
      -
      1297 }
      -
      1298 }
      -
      1299
      -
      1300
      -
      1315 [[nodiscard]]
      -
      1316 inline constexpr size_type rfind(const CppStringT& sub, const size_type start) const noexcept
      -
      1317 {
      -
      1318 return rfind(sub, start, this->size() - 1);
      -
      1319 }
      -
      1320
      -
      1321
      -
      1336 [[nodiscard]]
      -
      1337 inline constexpr size_type rfind(const CppStringT& sub) const noexcept
      -
      1338 {
      -
      1339 return MyBaseClass::rfind(sub);
      -
      1340 }
      -
      1341
      -
      1342
      -
      1343 //--- rfind_n() ---------------------------------------
      -
      1352 [[nodiscard]]
      -
      1353 inline constexpr size_type rfind_n(const CppStringT& sub, const size_type start, const size_type count) const noexcept
      -
      1354 {
      -
      1355 return rfind(sub, start, start + count - 1);
      -
      1356 }
      -
      1357
      -
      1366 [[nodiscard]]
      -
      1367 inline constexpr size_type rfind_n(const CppStringT& sub, const size_type count) const noexcept
      -
      1368 {
      -
      1369 if (count == 0) [[unlikely]]
      -
      1370 return CppStringT::npos;
      -
      1371 else [[likely]]
      -
      1372 return rfind(sub, 0, count - 1);
      -
      1373 }
      -
      1374
      -
      1375
      -
      1376 //--- rindex() ----------------------------------------
      -
      1382 [[nodiscard]]
      -
      1383 inline constexpr size_type rindex(const CppStringT& sub, const size_type start, const size_type end) const
      -
      1384 {
      -
      1385 const size_type ret_value = rfind(sub, start, end);
      -
      1386 if (ret_value == CppStringT::npos)
      -
      1387 throw NotFoundException("substring not found in string");
      -
      1388 else
      -
      1389 return ret_value;
      -
      1390 }
      -
      1391
      -
      1397 [[nodiscard]]
      -
      1398 inline constexpr size_type rindex(const CppStringT& sub, const size_type start) const
      -
      1399 {
      -
      1400 return rindex(sub, start, this->size() - 1);
      -
      1401 }
      -
      1402
      -
      1408 [[nodiscard]]
      -
      1409 inline constexpr size_type rindex(const CppStringT& sub) const
      -
      1410 {
      -
      1411 return rindex(sub, 0, this->size() - 1);
      -
      1412 }
      -
      1413
      -
      1414
      -
      1415 //--- rindex_n() --------------------------------------
      -
      1421 [[nodiscard]]
      -
      1422 inline constexpr size_type rindex_n(const CppStringT& sub, const size_type start, const size_type count) const
      -
      1423 {
      -
      1424 return rindex(sub, start, start + count - 1);
      -
      1425 }
      -
      1426
      -
      1432 [[nodiscard]]
      -
      1433 inline constexpr size_type rindex_n(const CppStringT& sub, const size_type count) const
      -
      1434 {
      -
      1435 return rindex(sub, 0, count);
      -
      1436 }
      -
      1437
      -
      1438
      -
      1439 //--- rjust() -----------------------------------------
      -
      1445 [[nodiscard]]
      -
      1446 inline CppStringT rjust(const size_type width, const value_type fillch = value_type(' ')) const noexcept
      -
      1447 {
      -
      1448 if (this->size() >= width) [[unlikely]]
      -
      1449 return *this;
      -
      1450 else [[likely]]
      -
      1451 return *this + CppStringT(width - this->size(), fillch);
      -
      1452 }
      -
      1453
      -
      1454
      -
      1455 //--- rpartition() -------------------------------------
      -
      1461 [[nodiscard]]
      -
      1462 std::vector<CppStringT> rpartition(const CppStringT& sep) const noexcept
      -
      1463 {
      -
      1464 const size_type sep_index = rfind(sep);
      -
      1465 if (sep_index == CppStringT::npos) {
      -
      1466 const CppStringT empty{};
      -
      1467 return std::vector<CppStringT>({ *this, empty, empty });
      -
      1468 }
      -
      1469 else {
      -
      1470 const size_type third_index = sep_index + sep.size();
      -
      1471 const size_type third_size = this->size() - third_index + 1;
      -
      1472 return std::vector<CppStringT>({ this->substr(0, sep_index), sep, this->substr(third_index, third_size) });
      -
      1473 }
      -
      1474 }
      -
      1475
      -
      1476
      -
      1477 //--- rsplit() ----------------------------------------
      -
      1483 [[nodiscard]]
      -
      1484 inline std::vector<CppStringT> rsplit() noexcept
      -
      1485 {
      -
      1486 return split();
      -
      1487 }
      -
      1488
      -
      1490 [[nodiscard]]
      -
      1491 inline std::vector<CppStringT> rsplit(const CppStringT& sep) noexcept
      -
      1492 {
      -
      1493 return split(sep);
      -
      1494 }
      -
      1495
      -
      1497 [[nodiscard]]
      -
      1498 inline std::vector<CppStringT> rsplit(const size_type maxsplit) noexcept
      -
      1499 {
      -
      1500 return rsplit(CppStringT(value_type(' ')), maxsplit);
      -
      1501 }
      -
      1502
      -
      1504 [[nodiscard]]
      -
      1505 std::vector<CppStringT> rsplit(const CppStringT& sep, const size_type maxsplit) noexcept
      -
      1506 {
      -
      1507 std::vector<CppStringT> res{};
      -
      1508
      -
      1509 if (maxsplit == 0) [[unlikely]] {
      -
      1510 res.push_back({ *this });
      -
      1511 }
      -
      1512 else [[likely]] {
      -
      1513 const size_type sep_size{ sep.size() };
      -
      1514 std::vector<size_type> indexes{};
      -
      1515 CppStringT tmp{ *this };
      -
      1516 size_type count{ maxsplit };
      -
      1517 size_type index{ 0 };
      -
      1518
      -
      1519 while ((index = tmp.rfind(sep)) != CppStringT::npos && count > 0) {
      -
      1520 indexes.insert(indexes.begin(), index);
      -
      1521 if (index == 0)
      -
      1522 break;
      -
      1523 tmp = tmp.substr(0, index);
      -
      1524 count--;
      -
      1525 }
      -
      1526
      -
      1527 if (indexes.size() == 0)
      -
      1528 res.push_back(*this);
      -
      1529 else {
      -
      1530 index = 0;
      -
      1531 for (const size_type ndx : indexes) {
      -
      1532 res.push_back(this->substr(index, ndx - index));
      -
      1533 index = ndx + sep_size;
      -
      1534 }
      -
      1535 }
      -
      1536 res.push_back(this->substr(index, this->size() - index));
      -
      1537 }
      -
      1538
      -
      1539 return res;
      -
      1540 }
      -
      1541
      -
      1542
      -
      1543 //--- rstrip() ----------------------------------------
      -
      1551 [[nodiscard]]
      -
      1552 inline CppStringT rstrip(const CppStringT& removedchars) const noexcept
      -
      1553 {
      -
      1554 for (auto it = this->crbegin(); it != this->crend(); ++it)
      -
      1555 if (std::none_of(removedchars.cbegin(), removedchars.cend(), [it](const value_type ch) { return *it == ch; }))
      -
      1556 return CppStringT(this->cbegin(), this->cbegin() + this->size() - (it - this->crbegin()));
      -
      1557 return CppStringT();
      -
      1558 }
      -
      1559
      -
      1561 [[nodiscard]]
      -
      1562 inline CppStringT rstrip() const noexcept
      -
      1563 {
      -
      1564 for (auto it = this->crbegin(); it != this->crend(); ++it)
      -
      1565 if (*it != value_type(' '))
      -
      1566 return CppStringT(this->cbegin(), this->cbegin() + this->size() - (it - this->crbegin()));
      -
      1567 return CppStringT();
      -
      1568 }
      -
      1569
      -
      1570
      -
      1571 //--- split() -----------------------------------------
      -
      1577 [[nodiscard]]
      -
      1578 inline std::vector<CppStringT> split() noexcept
      -
      1579 {
      -
      1580 std::vector<CppStringT> res;
      -
      1581 const CppStringT whitespace(value_type(' '));
      -
      1582 for (const auto& word : *this | std::views::split(whitespace))
      -
      1583 res.push_back(CppStringT(word.begin(), word.end()));
      -
      1584 return res;
      -
      1585 }
      -
      1586
      -
      1596 [[nodiscard]]
      -
      1597 inline std::vector<CppStringT> split(const CppStringT& sep) noexcept
      -
      1598 {
      -
      1599 std::vector<CppStringT> res;
      -
      1600 for (const auto& word : *this | std::views::split(sep))
      -
      1601 res.push_back(CppStringT(word.begin(), word.end()));
      -
      1602 return res;
      -
      1603 }
      -
      1604
      -
      1606 [[nodiscard]]
      -
      1607 inline std::vector<CppStringT> split(const size_type maxsplit) noexcept
      -
      1608 {
      -
      1609 return split(CppStringT(value_type(' ')), maxsplit);
      -
      1610 }
      -
      1611
      -
      1613 [[nodiscard]]
      -
      1614 std::vector<CppStringT> split(const CppStringT& sep, const size_type maxsplit) noexcept
      -
      1615 {
      -
      1616 std::vector<CppStringT> res{};
      -
      1617
      -
      1618 if (maxsplit == 0) [[unlikely]] {
      -
      1619 res.push_back(*this);
      -
      1620 }
      -
      1621 else [[likely]] {
      -
      1622 const size_type sep_size{ sep.size() };
      -
      1623 std::vector<size_type> indexes{};
      -
      1624 size_type count{ maxsplit };
      -
      1625 size_type index{ 0 };
      -
      1626
      -
      1627 while ((index = this->find(sep, index)) != CppStringT::npos && count > 0) {
      -
      1628 indexes.push_back(index);
      -
      1629 if (index == this->size())
      -
      1630 break;
      -
      1631 index += sep_size;
      -
      1632 count--;
      -
      1633 }
      -
      1634
      -
      1635 if (indexes.size() == 0)
      -
      1636 res.push_back(*this);
      -
      1637 else {
      -
      1638 index = 0;
      -
      1639 for (const size_type ndx : indexes) {
      -
      1640 res.push_back(this->substr(index, ndx - index));
      -
      1641 index = ndx + sep_size;
      -
      1642 }
      -
      1643 }
      -
      1644 res.push_back(this->substr(index, this->size() - index));
      -
      1645 }
      -
      1646
      -
      1647 return res;
      -
      1648 }
      -
      1649
      -
      1650
      -
      1651 //--- splitlines() ------------------------------------
      -
      1670 [[nodiscard]]
      -
      1671 std::vector<CppStringT> splitlines(const bool keep_end = false) const noexcept
      -
      1672 {
      -
      1673 std::vector<CppStringT> res{};
      -
      1674 CppStringT current{};
      -
      1675 bool prev_cr = false;
      -
      1676
      -
      1677 for (const value_type ch : *this) {
      -
      1678 switch (ch) {
      -
      1679 case 0x0b: [[unlikely]] // Line Tabulation, \v as well as \x0b and \013
      -
      1680 case 0x0c: [[unlikely]] // Form Feed, \f as well as \x0c and \014
      -
      1681 case 0x1c: [[unlikely]] // File Separator, or \034
      -
      1682 case 0x1d: [[unlikely]] // Group Separator, or \035
      -
      1683 case 0x1e: [[unlikely]] // Record Separator, or \036
      -
      1684 //case L'\u0085': [[unlikely]] // Next Line (C1 Control Code), or \0205
      -
      1685 //case L'\u2028': [[unlikely]] // Line Separator
      -
      1686 //case L'\u2029': [[unlikely]] // Paragraph Separator
      -
      1687 if (prev_cr) [[unlikely]] {
      -
      1688 res.push_back(current);
      -
      1689 current.clear();
      -
      1690 }
      -
      1691 if (keep_end) [[unlikely]]
      -
      1692 current += ch;
      -
      1693 res.push_back(current);
      -
      1694 current.clear();
      -
      1695 prev_cr = false;
      -
      1696 break;
      -
      1697
      -
      1698 case value_type('\r'): [[unlikely]] // Line Feed
      -
      1699 if (prev_cr) [[unlikely]] {
      -
      1700 res.push_back(current);
      -
      1701 current.clear();
      -
      1702 }
      -
      1703 if (keep_end) [[unlikely]]
      -
      1704 current += ch;
      -
      1705 prev_cr = true;
      -
      1706 break;
      -
      1707
      -
      1708 case value_type('\n'): [[unlikely]] // Carriage return
      -
      1709 if (keep_end) [[unlikely]]
      -
      1710 current += ch;
      -
      1711 res.push_back(current);
      -
      1712 current.clear();
      -
      1713 prev_cr = false;
      -
      1714 break;
      -
      1715
      -
      1716
      -
      1717 default: [[likely]]
      -
      1718 if (prev_cr) [[unlikely]] {
      -
      1719 res.push_back(current);
      -
      1720 current.clear();
      -
      1721 prev_cr = false;
      -
      1722 }
      -
      1723 current += ch;
      -
      1724 break;
      -
      1725 }
      -
      1726 }
      -
      1727
      -
      1728 if (prev_cr) [[unlikely]] {
      -
      1729 res.push_back(current);
      -
      1730 }
      -
      1731
      -
      1732 return res;
      -
      1733 }
      -
      1734
      -
      1735
      -
      1736 //--- startswith() ------------------------------------
      -
      1738 [[nodiscard]]
      -
      1739 inline const bool startswith(const CppStringT& prefix, const size_type start, const size_type end) const noexcept
      -
      1740 {
      -
      1741 return this->substr(start, end - start + 1).MyBaseClass::starts_with(prefix);
      -
      1742 }
      -
      1743
      -
      1745 [[nodiscard]]
      -
      1746 inline const bool startswith(const CppStringT& prefix, const size_type start) const noexcept
      -
      1747 {
      -
      1748 return startswith(prefix, start, this->size() - 1);
      -
      1749 }
      -
      1750
      -
      1752 [[nodiscard]]
      -
      1753 inline const bool startswith(const CppStringT& prefix) const noexcept
      -
      1754 {
      -
      1755 return this->starts_with(prefix);
      -
      1756 }
      -
      1757
      -
      1759 [[nodiscard]]
      -
      1760 inline const bool startswith(const std::initializer_list<CppStringT>& prefixes, const size_type start, const size_type end) const noexcept
      -
      1761 {
      -
      1762 if (start > end)
      -
      1763 return false;
      -
      1764
      -
      1765 CppStringT tmp(this->substr(start, end));
      -
      1766 for (auto& prefix : prefixes) {
      -
      1767 if (tmp.starts_with(prefix))
      -
      1768 return true;
      -
      1769 }
      -
      1770 return false;
      -
      1771 }
      -
      1772
      -
      1773
      -
      1774 //--- startswith_n() ----------------------------------
      -
      1776 [[nodiscard]]
      -
      1777 inline const bool startswith_n(const CppStringT& prefix, const size_type start, const size_type count) const noexcept
      -
      1778 {
      -
      1779 return this->substr(start, count).MyBaseClass::starts_with(prefix);
      -
      1780 }
      -
      1781
      -
      1783 [[nodiscard]]
      -
      1784 inline const bool startswith_n(const CppStringT& prefix, const size_type count) const noexcept
      -
      1785 {
      -
      1786 return this->substr(0, count).MyBaseClass::starts_with(prefix);
      -
      1787 }
      -
      1788
      -
      1790 [[nodiscard]]
      -
      1791 inline const bool startswith_n(const std::initializer_list<CppStringT>& prefix, const size_type start, const size_type count) const noexcept
      -
      1792 {
      -
      1793 return startswith(prefix, start, count);
      -
      1794 }
      -
      1795
      -
      1796
      -
      1797 //--- strip() -----------------------------------------
      -
      1804 [[nodiscard]]
      -
      1805 inline CppStringT strip(const CppStringT& removedchars) const noexcept
      -
      1806 {
      -
      1807 return this->rstrip(removedchars).lstrip(removedchars);
      -
      1808 }
      -
      1809
      -
      1811 [[nodiscard]]
      -
      1812 inline CppStringT strip() const noexcept
      -
      1813 {
      -
      1814 return this->rstrip().lstrip();
      -
      1815 }
      -
      1816
      -
      1817
      -
      1818 //--- substr() ----------------------------------------
      -
      1820 [[nodiscard]]
      -
      1821 inline CppStringT substr(const size_type start, const size_type count = -1) const noexcept
      -
      1822 {
      -
      1823 if (start > this->size()) [[unlikely]]
      -
      1824 return CppStringT();
      -
      1825
      -
      1826 const size_type width{ std::min(count, this->size() - start + 1) };
      -
      1827 return CppStringT(MyBaseClass::substr(start, width));
      -
      1828 }
      -
      1829
      -
      1830
      -
      1831 //--- swapcase() --------------------------------------
      -
      1836 [[nodiscard]]
      -
      1837 inline CppStringT swapcase() const noexcept
      -
      1838 {
      -
      1839 CppStringT res;
      -
      1840 std::ranges::transform(*this, std::back_inserter(res), [](const value_type c) -> value_type { return pcs::swap_case(c); });
      -
      1841 return res;
      -
      1842 }
      -
      1843
      -
      1844
      -
      1845 //--- title() -----------------------------------------
      -
      1847 [[nodiscard]]
      -
      1848 CppStringT title() const noexcept
      -
      1849 {
      -
      1850 const CppStringT whitespace(value_type(' '));
      -
      1851
      -
      1852 CppStringT res(*this);
      -
      1853 std::vector<CppStringT> words = res.split(whitespace);
      -
      1854
      -
      1855 for (CppStringT& word : words)
      -
      1856 word = word.capitalize();
      -
      1857
      -
      1858 return whitespace.join(words);
      -
      1859 }
      -
      1860
      -
      1861
      -
      1862 //--- translate() -------------------------------------
      -
      1869 [[nodiscard]]
      -
      1870 CppStringT translate(TransTable& table) noexcept
      -
      1871 {
      -
      1872 CppStringT res{};
      -
      1873 for (auto ch : *this) {
      -
      1874 try { res += table[ch]; }
      -
      1875 catch (...) { res += ch; }
      -
      1876 }
      -
      1877 return res;
      -
      1878 }
      -
      1879
      -
      1880
      -
      1881 //--- upper () -----------------------------------------
      -
      1887 inline CppStringT& upper() noexcept
      -
      1888 {
      -
      1889 CppStringT res{};
      -
      1890 std::ranges::transform(*this, std::back_inserter(res), [&](const value_type ch) -> value_type { return this->upper(ch); });
      -
      1891 return *this = res;
      -
      1892 }
      -
      1893
      -
      1899 [[nodiscard]]
      -
      1900 static inline const value_type upper(const value_type ch) noexcept
      -
      1901 {
      -
      1902 return value_type(std::toupper(ch));
      -
      1903 }
      -
      1904
      -
      1905
      -
      1906 //--- zfill() -----------------------------------------
      -
      1913 [[nodiscard]]
      -
      1914 inline CppStringT zfill(const size_type width) const noexcept
      -
      1915 {
      -
      1916 if (this->size() >= width) [[unlikely]]
      -
      1917 return *this;
      -
      1918
      -
      1919 const size_type padding_width = width - this->size();
      -
      1920 if ((*this)[0] == '-' || (*this)[0] == '+') [[unlikely]]
      -
      1921 return (*this)[0] + this->substr(1, this->size() - 1).ljust(width - 1, value_type('0'));
      -
      1922 else [[likely]]
      -
      1923 return this->ljust(width, value_type('0'));
      -
      1924 }
      -
      1925
      -
      1926 };
      -
      1927
      -
      1928
      -
      1929 //===== litteral operators ============================
      -
      1931 inline CppString operator""_cs(const char* str, std::size_t len)
      -
      1932 {
      -
      1933 return CppString(CppString::MyBaseClass(str, len));
      -
      1934 }
      -
      1935
      -
      1937 inline CppWString operator""_cs(const wchar_t* str, std::size_t len)
      -
      1938 {
      -
      1939 return CppWString(CppWString::MyBaseClass(str, len));
      -
      1940 }
      -
      1941
      -
      1942
      -
      1943 //===== Slices ========================================
      -
      1944 //--- slices base -------------------------------------
      -
      1946 template<typename IntT>
      -
      1947 requires std::is_signed_v<IntT>
      -
      1948 class Slice
      -
      1949 {
      -
      1950 public:
      -
      1951 static constexpr IntT DEFAULT{ std::numeric_limits<IntT>::min() };
      -
      1952
      -
      1953 //--- Constructors / Destructor -------------------
      -
      1954 Slice(const IntT start = DEFAULT, const IntT stop = DEFAULT, const IntT step = DEFAULT) noexcept
      -
      1955 : _start(start)
      -
      1956 , _stop(stop)
      -
      1957 , _step(step)
      -
      1958 {}
      -
      1959
      -
      1960 virtual ~Slice() noexcept = default;
      -
      1961
      -
      1962
      -
      1963 //--- iterating -----------------------------------
      -
      1964 template<typename CharT = char>
      -
      1965#if (defined(_HAS_CXX20) && _HAS_CXX20)
      -
      1966 requires std::is_same_v<CharT, char> || std::is_same_v<CharT, char8_t> || std::is_same_v<CharT, char16_t> || std::is_same_v<CharT, char32_t> || std::is_same_v<CharT, wchar_t>
      -
      1967#else
      -
      1968 requires std::is_same_v<CharT, char> || std::is_same_v<CharT, char16_t> || std::is_same_v<CharT, char32_t> || std::is_same_v<CharT, wchar_t>
      -
      1969#endif
      -
      1970 inline const IntT begin(const CppStringT<CharT>& str) noexcept
      -
      1971 {
      -
      1972 return _prepare_iterating(IntT(str.size()));
      -
      1973 }
      -
      1974
      -
      1975 [[nodiscard]]
      -
      1976 inline const bool end() const noexcept
      -
      1977 {
      -
      1978 return _step == 0 ? true : _step > 0 ? _index >= _stop : _index <= _stop;
      -
      1979 }
      -
      1980
      -
      1981 inline Slice operator++() noexcept
      -
      1982 {
      -
      1983 _index += _step;
      -
      1984 return *this;
      -
      1985 }
      -
      1986
      -
      1987 inline Slice operator++(int) noexcept
      -
      1988 {
      -
      1989 _index += _step;
      -
      1990 return *this;
      -
      1991 }
      -
      1992
      -
      1993 [[nodiscard]]
      -
      1994 inline const IntT operator*() noexcept
      -
      1995 {
      -
      1996 return _index;
      -
      1997 }
      -
      1998
      -
      1999 //--- properties ----------------------------------
      -
      2000 inline IntT start() { return _start; }
      -
      2001 inline IntT stop() { return _stop; }
      -
      2002 inline IntT step() { return _step; }
      -
      2003
      -
      2004
      -
      2005 private:
      -
      2006 IntT _start{ 0 };
      -
      2007 IntT _stop{ DEFAULT };
      -
      2008 IntT _step{ 1 };
      -
      2009
      -
      2010 IntT _index{ 0 };
      -
      2011
      -
      2012 [[nodiscard]]
      -
      2013 const IntT _prepare_iterating(const IntT str_size) noexcept
      -
      2014 {
      -
      2015 if (_start == DEFAULT) {
      -
      2016 if (_step < 0 && _step != DEFAULT) [[unlikely]]
      -
      2017 _start = str_size - 1;
      -
      2018 else [[likely]]
      -
      2019 _start = 0;
      -
      2020 }
      -
      2021 else if (_start < 0) {
      -
      2022 _start += str_size;
      -
      2023 if (_start < 0) [[unlikely]]
      -
      2024 _start = 0;
      -
      2025 }
      -
      2026 else if (_start >= str_size) {
      -
      2027 if (_step < 0 && _step != DEFAULT)
      -
      2028 _start = str_size - 1;
      -
      2029 }
      -
      2030
      -
      2031 if (_stop == DEFAULT) {
      -
      2032 if (_step < 0 && _step != DEFAULT) [[unlikely]]
      -
      2033 _stop = 0;
      -
      2034 else
      -
      2035 _stop = str_size;
      -
      2036 }
      -
      2037 else if (_stop < 0) {
      -
      2038 _stop += str_size;
      -
      2039 if (_stop < 0)
      -
      2040 _stop = 0;
      -
      2041 }
      -
      2042 else if (_stop > str_size)
      -
      2043 _stop = str_size;
      -
      2044
      -
      2045 if (_step == DEFAULT) [[likely]]
      -
      2046 _step = 1;
      -
      2047 if (_step < 0) [[unlikely]] {
      -
      2048 if (_start <= _stop)
      -
      2049 _step = 0; // will force end() to true
      -
      2050 }
      -
      2051 else [[unlikely]] {
      -
      2052 if (_start >= _stop)
      -
      2053 _step = 0; // will force end() to true
      -
      2054 }
      -
      2055
      -
      2056 return _index = _start;
      -
      2057 }
      -
      2058 };
      -
      2059
      -
      2060
      -
      2062 template<typename IntT>
      -
      2063 requires std::is_signed_v<IntT>
      -
      2064 struct StartSlice : public Slice<IntT>
      -
      2065 {
      -
      2066 using MyBaseClass = Slice<IntT>;
      -
      2067
      -
      2068 //--- Constructors / Destructor -------------------
      -
      2069 inline StartSlice(const IntT start = MyBaseClass::DEFAULT) noexcept
      -
      2070 : MyBaseClass(start, MyBaseClass::DEFAULT, 1)
      -
      2071 {}
      -
      2072
      -
      2073 virtual ~StartSlice() noexcept = default;
      -
      2074 };
      -
      2075
      -
      2076
      -
      2078 template<typename IntT>
      -
      2079 requires std::is_signed_v<IntT>
      -
      2080 struct StopSlice : public Slice<IntT>
      -
      2081 {
      -
      2082 using MyBaseClass = Slice<IntT>;
      -
      2083
      -
      2084 //--- Constructors / Destructor -------------------
      -
      2085 inline StopSlice(const IntT stop = MyBaseClass::DEFAULT) noexcept
      -
      2086 : MyBaseClass(MyBaseClass::DEFAULT, stop, 1)
      -
      2087 {}
      -
      2088
      -
      2089 virtual ~StopSlice() noexcept = default;
      -
      2090 };
      -
      2091
      -
      2092
      -
      2094 template<typename IntT>
      -
      2095 requires std::is_signed_v<IntT>
      -
      2096 struct StepSlice : public Slice<IntT>
      -
      2097 {
      -
      2098 using MyBaseClass = Slice<IntT>;
      -
      2099
      -
      2100 //--- Constructors / Destructor -------------------
      -
      2101 inline StepSlice(const IntT step = MyBaseClass::DEFAULT) noexcept
      -
      2102 : MyBaseClass(MyBaseClass::DEFAULT, MyBaseClass::DEFAULT, step)
      -
      2103 {}
      -
      2104
      -
      2105 virtual ~StepSlice() noexcept = default;
      -
      2106 };
      -
      2107
      -
      2108
      -
      2110 template<typename IntT>
      -
      2111 requires std::is_signed_v<IntT>
      -
      2112 struct StartStopSlice : public Slice<IntT>
      -
      2113 {
      -
      2114 using MyBaseClass = Slice<IntT>;
      -
      2115
      -
      2116 //--- Constructors / Destructor -------------------
      -
      2117 inline StartStopSlice(const IntT start = MyBaseClass::DEFAULT, const IntT stop = MyBaseClass::DEFAULT) noexcept
      -
      2118 : MyBaseClass(start, stop, 1)
      -
      2119 {}
      -
      2120
      -
      2121 virtual ~StartStopSlice() noexcept = default;
      -
      2122 };
      -
      2123
      -
      2124
      -
      2126 template<typename IntT>
      -
      2127 requires std::is_signed_v<IntT>
      -
      2128 struct StartStepSlice : public Slice<IntT>
      -
      2129 {
      -
      2130 using MyBaseClass = Slice<IntT>;
      -
      2131
      -
      2132 //--- Constructors / Destructor -------------------
      -
      2133 inline StartStepSlice(const IntT start = MyBaseClass::DEFAULT, const IntT step = MyBaseClass::DEFAULT) noexcept
      -
      2134 : MyBaseClass(start, MyBaseClass::DEFAULT, step)
      -
      2135 {}
      -
      2136
      -
      2137 virtual ~StartStepSlice() noexcept = default;
      -
      2138
      -
      2139 };
      -
      2140
      -
      2141
      -
      2143 template<typename IntT>
      -
      2144 requires std::is_signed_v<IntT>
      -
      2145 struct StopStepSlice : public Slice<IntT>
      -
      2146 {
      -
      2147 using MyBaseClass = Slice<IntT>;
      -
      2148
      -
      2149 //--- Constructors / Destructor -------------------
      -
      2150 inline StopStepSlice(const IntT stop = MyBaseClass::DEFAULT, const IntT step = MyBaseClass::DEFAULT) noexcept
      -
      2151 : MyBaseClass(MyBaseClass::DEFAULT, stop, step)
      -
      2152 {}
      -
      2153
      -
      2154 virtual ~StopStepSlice() noexcept = default;
      -
      2155 };
      -
      2156
      -
      2157
      -
      2158 //===== templated chars classes ===========================
      -
      2159 //--- is_alpha() ------------------------------------------
      -
      2161 template<class CharT>
      -
      2162 [[nodiscard]]
      -
      2163 inline const bool is_alpha(const CharT ch) noexcept
      -
      2164 {
      -
      2165 return false;
      -
      2166 }
      -
      2167
      -
      2169 template<>
      -
      2170 [[nodiscard]]
      -
      2171 inline const bool is_alpha<char>(const char ch) noexcept
      -
      2172 {
      -
      2173 return static_cast<const bool>(std::isalpha(static_cast<unsigned char>(ch)));
      -
      2174 }
      -
      2175
      -
      2177 template<>
      -
      2178 [[nodiscard]]
      -
      2179 inline const bool is_alpha<wchar_t>(const wchar_t ch) noexcept
      -
      2180 {
      -
      2181 return static_cast<const bool>(std::iswalpha(ch));
      -
      2182 }
      -
      2183
      -
      2184
      -
      2185 //--- is_ascii() ------------------------------------------
      -
      2187 template<class CharT>
      -
      2188 [[nodiscard]]
      -
      2189 inline const bool is_ascii(const CharT ch) noexcept
      -
      2190 {
      -
      2191 return CharT(0x00) <= ch && ch <= CharT(0x7f);
      -
      2192 }
      -
      2193
      -
      2194
      -
      2195 //--- is_decimal() ----------------------------------------
      -
      2197 template<class CharT>
      -
      2198 [[nodiscard]]
      -
      2199 inline const bool is_decimal(const CharT ch) noexcept
      -
      2200 {
      -
      2201 return false;
      -
      2202 }
      -
      2203
      -
      2205 template<>
      -
      2206 [[nodiscard]]
      -
      2207 inline const bool is_decimal<char>(const char ch) noexcept
      -
      2208 {
      -
      2209 return static_cast<const bool>(std::isdigit(static_cast<unsigned char>(ch)));
      -
      2210 }
      -
      2211
      -
      2213 template<>
      -
      2214 [[nodiscard]]
      -
      2215 inline const bool is_decimal<wchar_t>(const wchar_t ch) noexcept
      -
      2216 {
      -
      2217 return (const bool)std::iswdigit(ch);
      -
      2218 }
      -
      2219
      -
      2220
      -
      2221 //--- is_digit() ------------------------------------------
      -
      2223 template<class CharT>
      -
      2224 [[nodiscard]]
      -
      2225 inline const bool is_digit(const CharT ch) noexcept
      -
      2226 {
      -
      2227 return pcs::is_decimal(ch);
      -
      2228 }
      -
      2229
      -
      2231 template<>
      -
      2232 [[nodiscard]]
      -
      2233 inline const bool is_digit<char>(const char ch) noexcept
      -
      2234 {
      -
      2235 return pcs::is_decimal(ch);
      -
      2236 }
      -
      2237
      -
      2239 template<>
      -
      2240 [[nodiscard]]
      -
      2241 inline const bool is_digit<wchar_t>(const wchar_t ch) noexcept
      -
      2242 {
      -
      2243 return pcs::is_decimal(ch);
      -
      2244 }
      -
      2245
      -
      2246
      -
      2247 //--- is_id_continue() ------------------------------------
      -
      2249 template<class CharT>
      -
      2250 [[nodiscard]]
      -
      2251 inline const bool is_id_continue(const CharT ch) noexcept
      -
      2252 {
      -
      2253 return pcs::is_id_start(ch) || pcs::is_decimal(ch);
      -
      2254 }
      -
      2255
      -
      2256
      -
      2257 //--- is_id_start() ---------------------------------------
      -
      2259 template<class CharT>
      -
      2260 [[nodiscard]]
      -
      2261 inline const bool is_id_start(const CharT ch) noexcept
      -
      2262 {
      -
      2263 return pcs::is_alpha(ch) || ch == CharT('_');
      -
      2264 }
      -
      2265
      -
      2266
      -
      2267 //--- is_lower() ------------------------------------------
      -
      2269 template<class CharT>
      -
      2270 [[nodiscard]]
      -
      2271 inline const bool is_lower(const CharT ch) noexcept
      -
      2272 {
      -
      2273 return false;
      -
      2274 }
      -
      2275
      -
      2277 template<>
      -
      2278 [[nodiscard]]
      -
      2279 inline const bool is_lower<char>(const char ch) noexcept
      -
      2280 {
      -
      2281 return std::islower(static_cast<unsigned char>(ch));
      -
      2282 }
      -
      2283
      -
      2285 template<>
      -
      2286 [[nodiscard]]
      -
      2287 inline const bool is_lower<wchar_t>(const wchar_t ch) noexcept
      -
      2288 {
      -
      2289 return std::iswlower(ch);
      -
      2290 }
      -
      2291
      -
      2292
      -
      2293 //--- is_numeric() ----------------------------------------
      -
      2295 template<class CharT>
      -
      2296 [[nodiscard]]
      -
      2297 inline const bool is_numeric(const CharT ch) noexcept
      -
      2298 {
      -
      2299 return pcs::is_decimal(ch);
      -
      2300 }
      -
      2301
      -
      2303 template<>
      -
      2304 [[nodiscard]]
      -
      2305 inline const bool is_numeric<char>(const char ch) noexcept
      -
      2306 {
      -
      2307 return pcs::is_decimal(ch);
      -
      2308 }
      -
      2309
      -
      2311 template<>
      -
      2312 [[nodiscard]]
      -
      2313 inline const bool is_numeric<wchar_t>(const wchar_t ch) noexcept
      -
      2314 {
      -
      2315 return pcs::is_decimal(ch);
      -
      2316 }
      -
      2317
      -
      2318
      -
      2319 //--- is_printable() --------------------------------------
      -
      2321 template<class CharT>
      -
      2322 [[nodiscard]]
      -
      2323 inline const bool is_printable(const CharT ch) noexcept
      -
      2324 {
      -
      2325 return false;
      -
      2326 }
      -
      2327
      -
      2329 template<>
      -
      2330 [[nodiscard]]
      -
      2331 inline const bool is_printable<char>(const char ch) noexcept
      -
      2332 {
      -
      2333 return static_cast<const bool>(std::isprint(static_cast<unsigned char>(ch)));
      -
      2334 }
      -
      2335
      -
      2337 template<>
      -
      2338 [[nodiscard]]
      -
      2339 inline const bool is_printable<wchar_t>(const wchar_t ch) noexcept
      -
      2340 {
      -
      2341 return static_cast<const bool>(std::iswprint(ch));
      -
      2342 }
      -
      2343
      -
      2344
      -
      2345 //--- is_punctuation() ------------------------------------
      -
      2347 template<class CharT>
      -
      2348 [[nodiscard]]
      -
      2349 inline const bool is_punctuation(const CharT ch) noexcept
      -
      2350 {
      -
      2351 return false;
      -
      2352 }
      -
      2353
      -
      2355 template<>
      -
      2356 [[nodiscard]]
      -
      2357 inline const bool is_punctuation<char>(const char ch) noexcept
      -
      2358 {
      -
      2359 return static_cast<const bool>(std::ispunct(static_cast<unsigned char>(ch)));
      -
      2360 }
      -
      2361
      -
      2363 template<>
      -
      2364 [[nodiscard]]
      -
      2365 inline const bool is_punctuation<wchar_t>(const wchar_t ch) noexcept
      -
      2366 {
      -
      2367 return static_cast<const bool>(std::iswpunct(ch));
      -
      2368 }
      -
      2369
      -
      2370
      -
      2371 //--- is_space() ------------------------------------------
      -
      2373 template<class CharT>
      -
      2374 [[nodiscard]]
      -
      2375 inline const bool is_space(const CharT ch) noexcept
      -
      2376 {
      -
      2377 return false;
      -
      2378 }
      -
      2379
      -
      2381 template<>
      -
      2382 [[nodiscard]]
      -
      2383 inline const bool is_space<char>(const char ch) noexcept
      -
      2384 {
      -
      2385 return static_cast<const bool>(std::isspace(static_cast<unsigned char>(ch)));
      -
      2386 }
      -
      2387
      -
      2389 template<>
      -
      2390 [[nodiscard]]
      -
      2391 inline const bool is_space<wchar_t>(const wchar_t ch) noexcept
      -
      2392 {
      -
      2393 return static_cast<const bool>(std::iswspace(ch));
      -
      2394 }
      -
      2395
      -
      2396
      -
      2397 //--- is_upper() ------------------------------------------
      -
      2399 template<class CharT>
      -
      2400 [[nodiscard]]
      -
      2401 inline const bool is_upper(const CharT ch) noexcept
      -
      2402 {
      -
      2403 return false;
      -
      2404 }
      -
      2405
      -
      2407 template<>
      -
      2408 [[nodiscard]]
      -
      2409 inline const bool is_upper<char>(const char ch) noexcept
      -
      2410 {
      -
      2411 return static_cast<const bool>(std::isupper(static_cast<unsigned char>(ch)));
      -
      2412 }
      -
      2413
      -
      2415 template<>
      -
      2416 [[nodiscard]]
      -
      2417 inline const bool is_upper<wchar_t>(const wchar_t ch) noexcept
      -
      2418 {
      -
      2419 return static_cast<const bool>(std::iswupper(ch));
      -
      2420 }
      -
      2421
      -
      2422
      -
      2423 //--- swap_case() -----------------------------------------
      -
      2425 template<class CharT>
      -
      2426 [[nodiscard]]
      -
      2427 inline const CharT swap_case(const CharT ch) noexcept
      -
      2428 {
      -
      2429 if (pcs::is_lower(ch))
      -
      2430 return pcs::to_upper(ch);
      -
      2431 else if (pcs::is_upper(ch))
      -
      2432 return pcs::to_lower(ch);
      -
      2433 else
      -
      2434 return ch;
      -
      2435 }
      -
      2436
      -
      2437
      -
      2438 //--- to_lower() ------------------------------------------
      -
      2440 template<class CharT>
      -
      2441 [[nodiscard]]
      -
      2442 inline const CharT to_lower(const CharT ch) noexcept
      -
      2443 {
      -
      2444 return ch;
      -
      2445 }
      -
      2446
      -
      2448 template<>
      -
      2449 [[nodiscard]]
      -
      2450 inline const char to_lower<char>(const char ch) noexcept
      -
      2451 {
      -
      2452 return std::tolower(static_cast<unsigned char>(ch));
      -
      2453 }
      -
      2454
      -
      2456 template<>
      -
      2457 [[nodiscard]]
      -
      2458 inline const wchar_t to_lower<wchar_t>(const wchar_t ch) noexcept
      -
      2459 {
      -
      2460 return std::towlower(ch);
      -
      2461 }
      -
      2462
      -
      2463
      -
      2464 //--- to_upper() ------------------------------------------
      -
      2466 template<class CharT>
      -
      2467 [[nodiscard]]
      -
      2468 inline const CharT to_upper(const CharT ch) noexcept
      -
      2469 {
      -
      2470 return ch;
      -
      2471 }
      -
      2472
      -
      2474 template<>
      -
      2475 [[nodiscard]]
      -
      2476 inline const char to_upper<char>(const char ch) noexcept
      -
      2477 {
      -
      2478 return std::toupper(static_cast<unsigned char>(ch));
      -
      2479 }
      -
      2480
      -
      2482 template<>
      -
      2483 [[nodiscard]]
      -
      2484 inline const wchar_t to_upper<wchar_t>(const wchar_t ch) noexcept
      -
      2485 {
      -
      2486 return std::towupper(ch);
      -
      2487 }
      -
      2488
      -
      2489#if defined(_MSC_VER)
      -
      2490# pragma warning(pop) // to avoid boring warnings with litteral operators definitions
      -
      2491#endif
      -
      2492
      -
      2493} // end of namespace pcs // (pythonic c++ strings)
      -
      TransTable(Key1It first_key, Key1It last_key, ValueIt first_value, ValueIt last_value, Key2It first_not_translated, Key2It last_not_translated)
      Creates a TransTable from three containers iterators (#9).
      Definition cppstrings.h:317
      -
      TransTable(const std::map< key_type, value_type > trans_table)
      Creates a TransTable from a standard map (#1).
      Definition cppstrings.h:197
      -
      TransTable(const StringViewLike &keys, const StringViewLike &values)
      Creates a TransTable from two string views (#10).
      Definition cppstrings.h:338
      -
      TransTable(KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)
      Creates a TransTable from two containers iterators (#8).
      Definition cppstrings.h:300
      -
      TransTable(const CppStringT &keys, const CppStringT &values)
      Creates a TransTable from two strings (#2).
      Definition cppstrings.h:207
      -
      TransTable(const CharT *keys, const CharT *values, const CharT *not_translated)
      Creates a TransTable from three pointers to null-terminated lists of characters (#7).
      Definition cppstrings.h:285
      -
      TransTable() noexcept=default
      Default empty constructor.
      -
      value_type operator[](const key_type ch) noexcept
      Indexing operator.
      Definition cppstrings.h:365
      -
      TransTable(const CharT *keys, const CharT *values)
      Creates a TransTable from two pointers to null-terminated lists of characters (#6).
      Definition cppstrings.h:271
      -
      TransTable(const CppStringT &keys, const CppStringT &values, const CppStringT &not_translated)
      Creates a TransTable from three strings (#3).
      Definition cppstrings.h:223
      -
      TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > &values)
      Creates a TransTable from a string and an initalization list (#4).
      Definition cppstrings.h:239
      -
      std::map< typename key_type, typename value_type > & get_table() noexcept
      < for tests purposes
      Definition cppstrings.h:376
      -
      TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > values, const CppStringT &not_translated)
      Creates a TransTable from a string, an initalization list and a string (#5).
      Definition cppstrings.h:255
      -
      This is the templated base class for all CppString classes.
      Definition cppstrings.h:166
      -
      CppStringT strip(const CppStringT &removedchars) const noexcept
      Returns a copy of the string with the leading and trailing characters removed.
      Definition cppstrings.h:1805
      -
      constexpr bool contains_n(const CppStringT &sub, const size_type start, const size_type count=-1) const noexcept
      Returns true if the passed string is found within the slice str[start:start+count-1],...
      Definition cppstrings.h:512
      -
      std::vector< CppStringT > rsplit(const CppStringT &sep) noexcept
      Returns a vector of the words in the whole string, using sep as the delimiter string.
      Definition cppstrings.h:1491
      -
      CppStringT removeprefix(const CppStringT &prefix) const noexcept
      If the string starts with the prefix string, returns a new string with the prefix removed....
      Definition cppstrings.h:1223
      -
      constexpr bool contains(const CppStringT &substr) const noexcept
      Returns true if this string contains the passed string, or false otherwise.
      Definition cppstrings.h:479
      -
      CppStringT operator*(std::int64_t count) const noexcept
      Generates a new string with count times the content of this string.
      Definition cppstrings.h:1186
      -
      const bool isdecimal() const noexcept
      Returns true if all characters in the string are decimal characters and there is at least one charact...
      Definition cppstrings.h:841
      -
      std::vector< CppStringT > splitlines(const bool keep_end=false) const noexcept
      Return a list of the lines in the string, breaking at line boundaries.
      Definition cppstrings.h:1671
      -
      CppStringT strip() const noexcept
      Returns a copy of the string with the leading and trailing whitespaces removed.
      Definition cppstrings.h:1812
      -
      CppStringT title() const noexcept
      Returns a titlecased copy of the string where words start with an uppercase character and the remaini...
      Definition cppstrings.h:1848
      -
      constexpr size_type index_n(const CppStringT &sub, const size_type count) const
      Like find_n(sub, count), but raises NotFoundException when the substring is not found.
      Definition cppstrings.h:790
      -
      CppStringT & format(const std::basic_format_string< char, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
      Definition cppstrings.h:737
      -
      CppStringT operator()(Slice< IntT > slice) const noexcept
      Generates a new string according to the specified slice.
      Definition cppstrings.h:1144
      -
      const bool isdigit() const noexcept
      Returns true if all characters in the string are digits and there is at least one character,...
      Definition cppstrings.h:862
      -
      constexpr size_type find(const CppStringT &sub, const size_type start=0, const size_type end=-1) const noexcept
      Returns the lowest index in the string where substring sub is found within the slice str[start:end],...
      Definition cppstrings.h:666
      -
      constexpr size_type index(const CppStringT &sub, const size_type start=0, const size_type end=-1) const
      Definition cppstrings.h:762
      -
      const bool ispunctuation() const noexcept
      Returns true if the string contains only one character and if this character belongs to the ASCII pun...
      Definition cppstrings.h:938
      -
      CppStringT translate(TransTable &table) noexcept
      Returns a copy of the string in which each character has been mapped through the given translation ta...
      Definition cppstrings.h:1870
      -
      constexpr size_type rindex(const CppStringT &sub, const size_type start) const
      Like rfind(sub, start), but raises NotFoundException when the substring is not found.
      Definition cppstrings.h:1398
      -
      CppStringT expand_tabs(const size_type tabsize=8) const noexcept
      Returns a copy of the string where all tab characters are replaced by one or more spaces,...
      Definition cppstrings.h:626
      -
      CppStringT join(const CppStringT &s) const noexcept
      Single parameter signature. Returns a copy of this parameter.
      Definition cppstrings.h:1043
      -
      const bool startswith(const std::initializer_list< CppStringT > &prefixes, const size_type start, const size_type end) const noexcept
      Returns true if the string starts with any of the specified prefixes, otherwise returns false....
      Definition cppstrings.h:1760
      -
      std::vector< CppStringT > rsplit(const size_type maxsplit) noexcept
      Returns a vector of the words in the string, as seperated with whitespace strings....
      Definition cppstrings.h:1498
      -
      const bool startswith_n(const CppStringT &prefix, const size_type start, const size_type count) const noexcept
      Returns true if the string starts with the specified suffix, otherwise returns false....
      Definition cppstrings.h:1777
      -
      const bool endswith(const CppStringT &suffix) const noexcept
      Returns true if the string ends with the specified suffix, otherwise returns false....
      Definition cppstrings.h:579
      -
      const bool endswith(const CppStringT &suffix, const size_type start, const size_type end) const noexcept
      Returns true if the string ends with the specified suffix, otherwise returns false....
      Definition cppstrings.h:565
      -
      const bool isalpha() const noexcept
      Returns true if all characters in the string are alphabetic and there is at least one character,...
      Definition cppstrings.h:815
      -
      CppStringT capitalize() noexcept
      Returns a copy of the string with its first character capitalized and the rest lowercased.
      Definition cppstrings.h:443
      -
      const bool endswith_n(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type count) const noexcept
      Returns true if the string ends with any of the specified suffixes, otherwise returns false....
      Definition cppstrings.h:617
      -
      constexpr size_type rfind_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept
      Returns the highest index in the string where substring sub is found within the slice str[start:start...
      Definition cppstrings.h:1353
      -
      CppStringT join(const CppStringT &first, const NextCppStringsT &... others) const noexcept
      Returns a string which is the concatenation of the strings in the parameters list.
      Definition cppstrings.h:1035
      -
      constexpr size_type rindex(const CppStringT &sub) const
      Like rfind(sub), but raises NotFoundException when the substring is not found.
      Definition cppstrings.h:1409
      -
      std::vector< CppStringT > split(const CppStringT &sep, const size_type maxsplit) noexcept
      Returns a vector of the words in the string, using sep as the delimiter string. At most maxsplit spli...
      Definition cppstrings.h:1614
      -
      const bool isnumeric() const noexcept
      Returns true if all characters in the string are numeric characters, and there is at least one charac...
      Definition cppstrings.h:915
      -
      constexpr size_type count_n(const CppStringT &sub, const size_type length) const noexcept
      Returns the number of non-overlapping occurrences of substring sub in the range [0,...
      Definition cppstrings.h:556
      -
      const bool startswith(const CppStringT &prefix, const size_type start, const size_type end) const noexcept
      Returns true if the string starts with the specified prefix, otherwise returns false....
      Definition cppstrings.h:1739
      -
      CppStringT & format(const std::basic_format_string< T, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
      Formats this string according to c++20 std::format() specification. Returns this string.
      Definition cppstrings.h:728
      -
      std::vector< CppStringT > rpartition(const CppStringT &sep) const noexcept
      Splits the string at the last occurrence of sep, and returns a 3-items vector containing the part bef...
      Definition cppstrings.h:1462
      -
      const bool endswith_n(const CppStringT &suffix, const size_type count) const noexcept
      Returns true if the string ends with the specified suffix, otherwise returns false....
      Definition cppstrings.h:610
      -
      CppStringT rjust(const size_type width, const value_type fillch=value_type(' ')) const noexcept
      Returns the string right justified in a string of length width.
      Definition cppstrings.h:1446
      -
      const bool isprintable() const noexcept
      Returns true if all characters in the string are printable or if the string is empty,...
      Definition cppstrings.h:929
      -
      constexpr size_type rindex(const CppStringT &sub, const size_type start, const size_type end) const
      Like rfind(sub, start, end), but raises NotFoundException when the substring is not found.
      Definition cppstrings.h:1383
      -
      CppStringT & upper() noexcept
      In-place replaces all characters of the string with their uppercase conversion. Returns a reference t...
      Definition cppstrings.h:1887
      -
      CppStringT swapcase() const noexcept
      Returns a copy of the string with uppercase characters converted to lowercase and vice versa.
      Definition cppstrings.h:1837
      -
      constexpr size_type find_n(const CppStringT &sub, const size_type count) const noexcept
      Returns the lowest index in the string where substring sub is found within the slice str[0:count-1],...
      Definition cppstrings.h:719
      -
      static const value_type lower(const value_type ch) noexcept
      Returns lowercase conversion of the character.
      Definition cppstrings.h:1095
      -
      const bool endswith(const CppStringT &suffix, const size_type end) const noexcept
      Returns true if the string ends with the specified suffix, otherwise returns false....
      Definition cppstrings.h:572
      -
      const bool isascii() const noexcept
      Returns true if the string is empty or all characters in the string are ASCII, or false otherwise.
      Definition cppstrings.h:827
      -
      const bool is_words_sep() const noexcept
      Returns true if there are only whitespace and punctuation characters in the string and there is at le...
      Definition cppstrings.h:982
      -
      constexpr size_type count_n(const CppStringT &sub, const size_type start, const size_type length) const noexcept
      Returns the number of non-overlapping occurrences of substring sub in the range [start,...
      Definition cppstrings.h:549
      -
      constexpr size_type rfind_n(const CppStringT &sub, const size_type count) const noexcept
      Returns the highest index in the string where substring sub is found within the slice str[0:count-1],...
      Definition cppstrings.h:1367
      -
      constexpr size_type count(const CppStringT &sub, const size_type start=0, const size_type end=-1) const noexcept
      Returns the number of non-overlapping occurrences of substring sub in the range [start,...
      Definition cppstrings.h:526
      -
      std::vector< CppStringT > split() noexcept
      Returns a vector of the words in the whole string, as seperated with whitespace strings.
      Definition cppstrings.h:1578
      -
      const bool endswith_n(const CppStringT &suffix, const size_type start, const size_type count) const noexcept
      Returns true if the string ends with the specified suffix, otherwise returns false....
      Definition cppstrings.h:603
      -
      std::vector< CppStringT > rsplit() noexcept
      Returns a vector of the words in the whole string, as seperated with whitespace strings.
      Definition cppstrings.h:1484
      -
      CppStringT rstrip() const noexcept
      Returns a copy of the string with trailing whitespaces removed.
      Definition cppstrings.h:1562
      -
      const bool endswith(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type end) const noexcept
      Returns true if the string ends with any of the specified suffixes, otherwise returns false....
      Definition cppstrings.h:586
      -
      CppStringT rstrip(const CppStringT &removedchars) const noexcept
      Returns a copy of the string with trailing characters removed.
      Definition cppstrings.h:1552
      -
      std::vector< CppStringT > split(const size_type maxsplit) noexcept
      Returns a vector of the words in the string, as seperated with whitespace strings....
      Definition cppstrings.h:1607
      -
      const bool isalnum() const noexcept
      Returns true if all characters in the string are alphanumeric and there is at least one character,...
      Definition cppstrings.h:799
      -
      const bool isidentifier() const noexcept
      Returns true if the string is not empty and is a valid identifier according to the language definitio...
      Definition cppstrings.h:889
      -
      CppStringT & format(const std::basic_format_string< wchar_t, std::type_identity_t< ArgsT >... > frmt, ArgsT &&... args)
      Definition cppstrings.h:746
      -
      const bool isspace() const noexcept
      Returns true if there are only whitespace characters in the string and there is at least one characte...
      Definition cppstrings.h:947
      -
      CppStringT substr(const size_type start, const size_type count=-1) const noexcept
      Definition cppstrings.h:1821
      -
      CppStringT join(const std::vector< CppStringT > &strs) const noexcept
      Returns a string which is the concatenation of the strings in the vector parameter.
      Definition cppstrings.h:1017
      -
      constexpr size_type rfind(const CppStringT &sub, const size_type start) const noexcept
      Returns the highest index in the string where substring sub is found starting at start position in st...
      Definition cppstrings.h:1316
      -
      const CppStringT join() const noexcept
      Empty parameters list signature. Returns a copy of current string.
      Definition cppstrings.h:1050
      -
      std::vector< CppStringT > rsplit(const CppStringT &sep, const size_type maxsplit) noexcept
      Returns a vector of the words in the string, using sep as the delimiter string. At most maxsplit spli...
      Definition cppstrings.h:1505
      -
      const bool startswith_n(const std::initializer_list< CppStringT > &prefix, const size_type start, const size_type count) const noexcept
      Returns true if the string starts with any of the specified suffixes, otherwise returns false....
      Definition cppstrings.h:1791
      -
      constexpr size_type rfind(const CppStringT &sub) const noexcept
      Returns the highest index in the string where C-substring sub is found in the whole string,...
      Definition cppstrings.h:1337
      -
      CppStringT lstrip() const noexcept
      Returns a copy of the string with leading whitespaces removed.
      Definition cppstrings.h:1120
      -
      CppStringT join(const std::array< CppStringT, N > &strs) const noexcept
      Returns a string which is the concatenation of the strings in the array parameter.
      Definition cppstrings.h:1000
      -
      constexpr size_type rindex_n(const CppStringT &sub, const size_type count) const
      Like rfind_n(sub, count), but raises NotFoundException when the substring is not found.
      Definition cppstrings.h:1433
      -
      constexpr size_type find_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept
      Returns the lowest index in the string where substring sub is found within the slice str[start:start+...
      Definition cppstrings.h:691
      -
      std::vector< CppStringT > partition(const CppStringT &sep) const noexcept
      Splits the string at the first occurrence of sep, and returns a 3-items vector containing the part be...
      Definition cppstrings.h:1205
      -
      std::vector< CppStringT > split(const CppStringT &sep) noexcept
      Returns a vector of the words in the whole string, using sep as the delimiter string.
      Definition cppstrings.h:1597
      -
      const bool startswith(const CppStringT &prefix, const size_type start) const noexcept
      Returns true if the string starts with the specified prefix, otherwise returns false....
      Definition cppstrings.h:1746
      -
      CppStringT zfill(const size_type width) const noexcept
      Returns a copy of the string left filled with ASCII '0' digits to make a string of length width.
      Definition cppstrings.h:1914
      -
      CppStringT replace(const CppStringT &old, const CppStringT &new_, size_type count=-1) const noexcept
      Returns a copy of the string with first count occurrences of substring 'old' replaced by 'new_'.
      Definition cppstrings.h:1251
      -
      CppStringT & lower() noexcept
      In-place replaces all characters of the string with their lowercase conversion. Returns a reference t...
      Definition cppstrings.h:1078
      -
      CppStringT removesuffix(const CppStringT &suffix) const noexcept
      If the string ends with the suffix string, returns a new string with the suffix removed....
      Definition cppstrings.h:1237
      -
      const bool istitle() const noexcept
      Returns true if the string is a titlecased string and there is at least one character,...
      Definition cppstrings.h:964
      -
      const bool startswith_n(const CppStringT &prefix, const size_type count) const noexcept
      Returns true if the string starts with the specified suffix, otherwise returns false....
      Definition cppstrings.h:1784
      -
      const bool startswith(const CppStringT &prefix) const noexcept
      Returns true if the string starts with the specified prefix, otherwise returns false....
      Definition cppstrings.h:1753
      -
      const bool islower() const noexcept
      Returns true if all cased characters in the string are lowercase and there is at least one cased char...
      Definition cppstrings.h:898
      -
      CppStringT ljust(const size_type width, const value_type fillch=value_type(' ')) const noexcept
      Returns the string left justified in a string of length width.
      Definition cppstrings.h:1063
      -
      CppStringT lstrip(const CppStringT &removedchars) const noexcept
      Returns a copy of the string with leading characters removed.
      Definition cppstrings.h:1110
      -
      constexpr size_type index_n(const CppStringT &sub, const size_type start, const size_type count) const
      Like find_n(sub, start, count), but raises NotFoundException when the substring is not found.
      Definition cppstrings.h:779
      -
      CppStringT center(const size_type width, const value_type fillch=value_type(' ')) const noexcept
      Returns a copy of the string centered in a string of length width.
      Definition cppstrings.h:462
      -
      const bool isupper() const noexcept
      Returns true if all cased characters in the string are uppercase and there is at least one cased char...
      Definition cppstrings.h:973
      -
      constexpr size_type rfind(const CppStringT &sub, const size_type start, const size_type end) const noexcept
      Returns the highest index in the string where substring sub is found within the slice str[start:end],...
      Definition cppstrings.h:1288
      -
      static const value_type upper(const value_type ch) noexcept
      Returns uppercase conversion of the character.
      Definition cppstrings.h:1900
      -
      constexpr size_type rindex_n(const CppStringT &sub, const size_type start, const size_type count) const
      Like rfind_n(sub, start, count), but raises NotFoundException when the substring is not found.
      Definition cppstrings.h:1422
      -
      Base class for slices, with start, stop and step specified values.
      Definition cppstrings.h:1949
      -
      IntT stop()
      Returns the stop index of this slide.
      Definition cppstrings.h:2001
      -
      IntT start()
      Returns the start index of this slide.
      Definition cppstrings.h:2000
      -
      IntT step()
      Returns the step value of this slide.
      Definition cppstrings.h:2002
      -
      Slice operator++() noexcept
      < iterates one step, pre-increment. Caution: index may be out of bounds. Check '!end()' before derefe...
      Definition cppstrings.h:1981
      -
      Slice operator++(int) noexcept
      < iterates one step, post-increment. Caution: index may be out of bounds. Check '!...
      Definition cppstrings.h:1987
      -
      Slice(const IntT start=DEFAULT, const IntT stop=DEFAULT, const IntT step=DEFAULT) noexcept
      < Valued constructor
      Definition cppstrings.h:1954
      -
      const IntT begin(const CppStringT< CharT > &str) noexcept
      < starts iterating on specified CppString.
      Definition cppstrings.h:1970
      -
      virtual ~Slice() noexcept=default
      Default destructor.
      -
      const bool end() const noexcept
      < returns true when iterating is over, or false otherwise.
      Definition cppstrings.h:1976
      -
      const IntT operator*() noexcept
      < dereferences the slice.
      Definition cppstrings.h:1994
      -
      Definition cppstrings.h:41
      -
      const bool is_digit< wchar_t >(const wchar_t ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2241
      -
      const bool is_punctuation(const CharT ch) noexcept
      Returns true if character ch is punctuation, or false otherwise.
      Definition cppstrings.h:2349
      -
      const bool is_alpha< wchar_t >(const wchar_t ch) noexcept
      Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settin...
      Definition cppstrings.h:2179
      -
      CppStringT< char > CppString
      Specialization of basic class with template argument 'char'.
      Definition cppstrings.h:53
      -
      const bool is_printable< char >(const char ch) noexcept
      Returns true if character ch is printable, or false otherwise.
      Definition cppstrings.h:2331
      -
      const bool is_numeric< char >(const char ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2305
      -
      const bool is_decimal< char >(const char ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2207
      -
      const bool is_lower< char >(const char ch) noexcept
      Returns true if character ch is lowercase, or false otherwise. Conforms to the current locale setting...
      Definition cppstrings.h:2279
      -
      const bool is_printable< wchar_t >(const wchar_t ch) noexcept
      Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale setti...
      Definition cppstrings.h:2339
      -
      const bool is_punctuation< wchar_t >(const wchar_t ch) noexcept
      Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale setti...
      Definition cppstrings.h:2365
      -
      const bool is_alpha(const CharT ch) noexcept
      struct of slices with default start values
      Definition cppstrings.h:2163
      -
      const char to_lower< char >(const char ch) noexcept
      Returns the lowercase form of character ch if it exists, or ch itself otherwise. Conforms to the curr...
      Definition cppstrings.h:2450
      -
      const bool is_printable(const CharT ch) noexcept
      Returns true if character ch is printable, or false otherwise.
      Definition cppstrings.h:2323
      -
      const bool is_digit(const CharT ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2225
      -
      const bool is_space< wchar_t >(const wchar_t ch) noexcept
      Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settin...
      Definition cppstrings.h:2391
      -
      const CharT to_upper(const CharT ch) noexcept
      Returns the uppercase form of character ch if it exists, or ch itself otherwise.
      Definition cppstrings.h:2468
      -
      const bool is_decimal< wchar_t >(const wchar_t ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2215
      -
      const bool is_space< char >(const char ch) noexcept
      Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settin...
      Definition cppstrings.h:2383
      -
      CppStringT< wchar_t > CppWString
      Specialization of basic class with template argument 'wchar_t'.
      Definition cppstrings.h:54
      -
      const bool is_upper(const CharT ch) noexcept
      Returns true if character is uppercase, or false otherwise.
      Definition cppstrings.h:2401
      -
      const CharT to_lower(const CharT ch) noexcept
      Returns the lowercase form of character ch if it exists, or ch itself otherwise.
      Definition cppstrings.h:2442
      -
      const bool is_decimal(const CharT ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2199
      -
      const bool is_punctuation< char >(const char ch) noexcept
      Returns true if character ch is punctuation, or false otherwise. Conforms to the current locale setti...
      Definition cppstrings.h:2357
      -
      const wchar_t to_upper< wchar_t >(const wchar_t ch) noexcept
      Returns the uppercase form of character ch if it exists, or ch itself otherwise. Conforms to the curr...
      Definition cppstrings.h:2484
      -
      const wchar_t to_lower< wchar_t >(const wchar_t ch) noexcept
      Returns the lowercase form of character ch if it exists, or ch itself otherwise. Conforms to the curr...
      Definition cppstrings.h:2458
      -
      const bool is_upper< wchar_t >(const wchar_t ch) noexcept
      Returns true if character ch is uppercase, or false otherwise. Conforms to the current locale setting...
      Definition cppstrings.h:2417
      -
      const char to_upper< char >(const char ch) noexcept
      Returns the uppercase form of character ch if it exists, or ch itself otherwise. Conforms to the curr...
      Definition cppstrings.h:2476
      -
      const bool is_id_start(const CharT ch) noexcept
      Returns true if character is a starting char for identifiers, or false otherwise.
      Definition cppstrings.h:2261
      -
      const bool is_upper< char >(const char ch) noexcept
      Returns true if character ch is uppercase, or false otherwise. Conforms to the current locale setting...
      Definition cppstrings.h:2409
      -
      const CharT swap_case(const CharT ch) noexcept
      Returns the swapped case form of character ch if it exists, or ch itself otherwise.
      Definition cppstrings.h:2427
      -
      const bool is_ascii(const CharT ch) noexcept
      Returns true if character ch gets ASCII code, or false otherwise.
      Definition cppstrings.h:2189
      -
      const bool is_numeric< wchar_t >(const wchar_t ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2313
      -
      const bool is_lower< wchar_t >(const wchar_t ch) noexcept
      Returns true if character ch is lowercase, or false otherwise. Conforms to the current locale setting...
      Definition cppstrings.h:2287
      -
      const bool is_alpha< char >(const char ch) noexcept
      Returns true if character ch is alphabetic, or false otherwise. Conforms to the current locale settin...
      Definition cppstrings.h:2171
      -
      const bool is_lower(const CharT ch) noexcept
      Returns true if character is lowercase, or false otherwise.
      Definition cppstrings.h:2271
      -
      const bool is_id_continue(const CharT ch) noexcept
      Returns true if character is a continuing char for identifiers, or false otherwise.
      Definition cppstrings.h:2251
      -
      const bool is_space(const CharT ch) noexcept
      Returns true if character ch is white space, or false otherwise.
      Definition cppstrings.h:2375
      -
      const bool is_numeric(const CharT ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2297
      -
      const bool is_digit< char >(const char ch) noexcept
      Returns true if character is a decimal digit, or false otherwise.
      Definition cppstrings.h:2233
      -
      Base class for slices, with start, stop and step specified values.
      Definition cppstrings.h:2065
      -
      virtual ~StartSlice() noexcept=default
      Default destructor.
      -
      StartSlice(const IntT start=MyBaseClass::DEFAULT) noexcept
      < Valued constructor
      Definition cppstrings.h:2069
      -
      struct of slices with default step values
      Definition cppstrings.h:2129
      -
      StartStepSlice(const IntT start=MyBaseClass::DEFAULT, const IntT step=MyBaseClass::DEFAULT) noexcept
      < Valued constructor
      Definition cppstrings.h:2133
      -
      virtual ~StartStepSlice() noexcept=default
      Default destructor.
      -
      struct of slices with default start and stop values
      Definition cppstrings.h:2113
      -
      StartStopSlice(const IntT start=MyBaseClass::DEFAULT, const IntT stop=MyBaseClass::DEFAULT) noexcept
      < Valued constructor
      Definition cppstrings.h:2117
      -
      virtual ~StartStopSlice() noexcept=default
      Default destructor.
      -
      struct of slices with default start and step values
      Definition cppstrings.h:2097
      -
      virtual ~StepSlice() noexcept=default
      Default destructor.
      -
      StepSlice(const IntT step=MyBaseClass::DEFAULT) noexcept
      < Valued constructor
      Definition cppstrings.h:2101
      -
      struct of slices with default stop and step values
      Definition cppstrings.h:2081
      -
      virtual ~StopSlice() noexcept=default
      Default destructor.
      -
      StopSlice(const IntT stop=MyBaseClass::DEFAULT) noexcept
      < Valued constructor
      Definition cppstrings.h:2085
      -
      struct of slices with default stop values
      Definition cppstrings.h:2146
      -
      StopStepSlice(const IntT stop=MyBaseClass::DEFAULT, const IntT step=MyBaseClass::DEFAULT) noexcept
      < Valued constructor
      Definition cppstrings.h:2150
      -
      virtual ~StopStepSlice() noexcept=default
      Default destructor.
      -
      -
      -
      - - - - diff --git a/cpp-strings/html/files_dup.js b/cpp-strings/html/files_dup.js deleted file mode 100644 index 0546064..0000000 --- a/cpp-strings/html/files_dup.js +++ /dev/null @@ -1,4 +0,0 @@ -var files_dup = -[ - [ "cppstrings.h", "cppstrings_8h_source.html", null ] -]; \ No newline at end of file diff --git a/cpp-strings/html/index.html b/cpp-strings/html/index.html deleted file mode 100644 index 528fc62..0000000 --- a/cpp-strings/html/index.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - -cpp-strings: Library cpp-strings - - - - - - - - - - - - - - -
      -
      - - - - - - -
      -
      cpp-strings 1.0.0 -
      -
      Pythonic c++ strings
      -
      -
      - - - - - - - -
      -
      - -
      -
      -
      - -
      -
      - -
      -
      - - -
      -
      -
      -
      -
      -
      Loading...
      -
      Searching...
      -
      No Matches
      -
      -
      -
      -
      - -
      -
      Library cpp-strings
      -
      -
      -

      -

      license Latest release code_coverage tests

      -

      -What if c++ strings where as easy to use as Python strings?

      -

      Let's just use c++ strings as are Python ones, with same API or as similar API as possible.
      - Library cpp-strings is fully templated. Just download header file cppstrings.h and put it anywhere in your project. Notice: all of its stuff is declared and defined in namespace pcs - which stands for P**ythonic **C++ **S**trings.

      -
        -
      • The templated class pcs::CppStringT<> defines all constructors and methods that implement the equivalent of Python strings API.
        -
      • -
      • Class pcs::CppString specializes the templated class with char characters.
      • -
      • Class pcs::CppWString specializes the templated class with wchar_t characters.
      • -
      -

      The cpp-strings HTML documentation is available in subdirectory cpp-strings/html. Click on file index.html there from your local file manager to browse its content.

      -

      Library cpp-strings is implemented with the currently most recent c++ standard available with gcc, clang and msvc c++ compilers, i.e. standard c++20.

      -
        -
      • directory cpp-strings contains the header file cppstring.h.
        - This is the header file to include in your projects.
      • -
      • directory cpp-strings-tests contains the unit-tests file cpp-strings-tests.cpp
        - This file tests all the library stuff. It is a valuable code container with so many examples of use of the library, the classes, the methods and the functions it defines.
      • -
      -

      The code has been developed using VS2022 IDE. As such, unitary tests have been coded using Microsoft Visual Studio Cpp Unit Test Framework. The related VS project is provided with this library.

      -

      Notice: no clang, gcc or msvc specific declarations or goodies have been use to code library cpp-strings. It should then be compilable with any of these compilers. To be able to use it with your project, just ensure that the c++ standard used with you favorite compiler is c++20:

        -
      • options -std=c++20 or -std=c++latest for clang and gcc (v. 10 and above),
        - or option -std=c++2a for clang and gcc (v. 9 and earlier);
      • -
      • options /std=c++20 or /std=c++latest for Visual Studio 2019 and later.
      • -
      -

      If you want to run the unitary tests, well, use the last version of Visual Studio (i.e. VS 2022, by July 2025). The Community free version will truly be fine.
      - The vcproject associated with the unit tests in cpp-strings is already configured to use the option flag /std:c++latest since the implemented code uses a very few but very useful c++23 goodies.

      -

      github repository: https://github.com/schmouk/pythonic-cpp-strings
      - pythonic-cpp-strings github web pages: https://schmouk.github.io/pythonic-cpp-strings/

      -
      -

      -License

      -
      Library cpp-strings
      -"What if c++ strings where as easy to use as Python strings?"
      -
      -Copyright (C) 2023-2025 Philippe Schmouker
      -contact - ph (dot) schmouker (at) gmail (dot) com
      -
      -This program is free software: you can redistribute it and/or modify
      -it under the terms of the GNU General Public License as published by
      -the Free Software Foundation,  either version 3  of the License,  or
      -(at your option) any later version.
      -
      -This program is distributed in the hope  that  it  will  be  useful,
      -but  WITHOUT  ANY  WARRANTY;  without  even  the implied warranty of
      -MERCHANTABILITY  or  FITNESS  FOR  A  PARTICULAR  PURPOSE.  See  the
      -GNU General Public License for more details.
      -
      -You should have received a copy  of  the  GNU General Public License
      -along with this program.  If not, see <https://www.gnu.org/licenses/>.
      -

      -

      -Intro

      -

      The creation of this library has been started with the aim at easing the use of strings in c++. Other projects exist, even aiming also to implement a Python-like strings API, but the only ones we have found were either started but not completed, or were not implementing the whole Python API.

      -

      So, we started to work on Pythonic c++ strings. Library cpp-strings is now ready. It fully implements the Python API (even with a c++ implementation of slices) and it is fully tested with unitary tests.

      -

      The implementation of library cpp-strings is fully templated and is contained into a single header file: cpp-strings/cppstrings.h. To take a whole benefit of it, just add this header file to your project and include it in your own files. It very fastly compiles. That's all!

      -

      Header file cpp-strings/cppstrings.h defines:

        -
      • templated class template<typename CharT> class pcs::CppStringT which implements all the stuff about pythonic c++ strings. It inherits from c++ STL class std::basic_string<CharT>, so it gets access to all c++ STL methods, functions and goodies about strings;
      • -
      • this class is specialized by: using pcs::CppString> = pcs::CppStringT<char> for pythonic c++ strings based on char characters;
      • -
      • it is also specialized by: using pcs::CppWString> = pcs::CppStringT<wchar_t> for pythonic c++ strings based on wchar_t characters.
      • -
      -

      The unitary tests are provided in directory cpp-strings-tests/. File cpp-strings-tests/cpp-strings-tests.cpp contains the related code. Tests have been coded using VS2022 IDE and as such, are using the Microsoft Visual Studio Cpp Unit Test Framework. The related VS project can be found in the same directory. It is already configured to create code for Release as well as for Debug configurations, and for 32-bits or 64-bits platforms at your choice.
      - This .cpp file is a great place to see cpp-strings code in action. Each structure, class, method, litteral operator and function being unitary tested in here, you should find there many examples of its use for all cpp-strings stuff.

      -
      -

      -Latest Release - Release 1.0 (1.0.0.229) 2025/07

      -

      The coding of this project started by March 2023 and had been put in standby mode for some months - no time to work on it. The very first release is now availble (since July 2025), as Release 1.0.

      -

      This release has been fully tested. Code coverage is 100%.

      -

      Release 1.0 implements all Python strings API but one feature (see below).

      -

      Python slices are implemented via c++ operator() as declared and defined in the templated class pcs::CppStringT<>. Python slices have next specific notation: [start : stop : step] and allow the running step by step through range [start, stop) (notice: stop is excluded from the range). Operator (start, stop, step) acts the same way while running through the content of pythonic c++ strings. A dedicated base class Slice is also provided and can be passed as argument to operator(). It is derived in many simpler slices classes, since Python slices may not define either start, stop or step which then get default values (resp. 0, end-of-sequence, and 1).

      -

      -Missing parts in Release 1.0

      -

      Python strings are based on Unicode chars. This is currently not the case for pythonic c++ strings in cpp-strings.
      - Unicode encoding allows for a specific comparison mode on strings, the casefold mode. There, Unicode chars are transformed into their lower equivalent char in a standardized manner which is more "agressive" than the simpler lowering method lower(). Comparing strings without taking into account the case of their chars is then performed in a far more accurate manner.
      - This feature is currently NOT implemented in library cpp-strings.

      -

      So up to now, if you want to compare pythonic c++ strings from cpp-strings on whatever the case is for each of their chars, compare them applying method .lower() to both strings. This will do the job for chars and for wchar_t also for a majority of languages (but might fail for very few signs of specific languages in this last case).

      -

      Notice: dealing with Unicode chars and implementing method casefold() as it is the case in Python is planned for a next release of library cpp-strings.
      - N.B. "*planned for a next release*" does not imply that a fixed date is planned either.

      -
      -

      -Documentation

      -

      The cpp-strings HTML documentation is available in subdirectory cpp-strings/html. Click on file index.html there from your local file manager to browse its content.

      -

      It has then been produced with the great utility doxygen developed by Vicente Hernando (the doxygen Github repository can be accessed here, and the utility can be downloaded from there: https://www.doxygen.nl/download.html).

      -

      This is a short documentation of the library. For some of its part it is a copy of the Python original documentation on strings. For its other part it documents the c++ implementation of cpp-strings.

      -

      And remember: to better understand how to use this pythonic c++ strings library, have a look also at cpp-strings-tests/cpp-strings-tests.cpp to see cpp-strings library code in action!

      -
      - -
      -
      -
      - - - - diff --git a/cpp-strings/html/index.js b/cpp-strings/html/index.js deleted file mode 100644 index c46f603..0000000 --- a/cpp-strings/html/index.js +++ /dev/null @@ -1,10 +0,0 @@ -var index = -[ - [ "License", "index.html#autotoc_md3", null ], - [ "Intro", "index.html#autotoc_md4", null ], - [ "Latest Release - Release 1.0 (1.0.0.229) 2025/07", "index.html#autotoc_md6", [ - [ "What if c++ strings where as easy to use as Python strings?", "index.html#autotoc_md1", null ], - [ "Missing parts in Release 1.0", "index.html#autotoc_md7", null ] - ] ], - [ "Documentation", "index.html#autotoc_md9", null ] -]; \ No newline at end of file diff --git a/cpp-strings/html/navtreeindex1.js b/cpp-strings/html/navtreeindex1.js deleted file mode 100644 index 28cf466..0000000 --- a/cpp-strings/html/navtreeindex1.js +++ /dev/null @@ -1,105 +0,0 @@ -var NAVTREEINDEX1 = -{ -"classpcs_1_1_slice.html#abdb6694913ed37cf4efc5d85e990c7b5":[1,0,0,1,1], -"classpcs_1_1_slice.html#abdb6694913ed37cf4efc5d85e990c7b5":[2,0,0,1,1], -"classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c":[1,0,0,1,3], -"classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c":[2,0,0,1,3], -"classpcs_1_1_slice.html#afa6b7dc85e796da20dd5933d49400996":[1,0,0,1,4], -"classpcs_1_1_slice.html#afa6b7dc85e796da20dd5933d49400996":[2,0,0,1,4], -"cppstrings_8h_source.html":[3,0,0], -"files.html":[3,0], -"functions.html":[2,3,0], -"functions_func.html":[2,3,1], -"hierarchy.html":[2,2], -"index.html":[], -"index.html":[0], -"index.html#autotoc_md1":[0], -"index.html#autotoc_md3":[0,0], -"index.html#autotoc_md4":[0,1], -"index.html#autotoc_md6":[0,2], -"index.html#autotoc_md7":[0,2,1], -"index.html#autotoc_md9":[0,3], -"namespacemembers.html":[1,1,0], -"namespacemembers_func.html":[1,1,1], -"namespacemembers_type.html":[1,1,2], -"namespacepcs.html":[1,0,0], -"namespacepcs.html#a01c6093b1a8ef52114f799635ff930d5":[1,0,0,19], -"namespacepcs.html#a02d340dd9c510eda0fbfed07a08d0792":[1,0,0,31], -"namespacepcs.html#a069625790af3ecf05a424c2c53eabfc0":[1,0,0,12], -"namespacepcs.html#a08d21c458d61442667df24212920d0d9":[1,0,0,8], -"namespacepcs.html#a1cd19ec212e3ada992a8effb8d5d872d":[1,0,0,29], -"namespacepcs.html#a242e3c28e3d47d19d70ab70d83e74d35":[1,0,0,26], -"namespacepcs.html#a28f77929d599a862403a4471f6b73fc3":[1,0,0,15], -"namespacepcs.html#a29893984c95e53a6efe01f74c2dcc03a":[1,0,0,23], -"namespacepcs.html#a30ed0cd7942d081369f78a49a029d8b1":[1,0,0,30], -"namespacepcs.html#a363e2bac9c403a623c5a410f7113edd3":[1,0,0,33], -"namespacepcs.html#a40bc3d234e3c737f34d267151ca62014":[1,0,0,10], -"namespacepcs.html#a4c4164fedd9cb659873a980fa855f4a2":[1,0,0,44], -"namespacepcs.html#a51cd6883557ab31a1e0c8e7b5ab27351":[1,0,0,28], -"namespacepcs.html#a52b12f8beb4ab7d8b819ca24180e08d1":[1,0,0,17], -"namespacepcs.html#a57a765c6eb624107a2176a56cf2220a7":[1,0,0,36], -"namespacepcs.html#a607c82cc94f2b6473d8391334eed8c14":[1,0,0,46], -"namespacepcs.html#a60a2017b25d3d06b83e72f5ed5a93d09":[1,0,0,16], -"namespacepcs.html#a714cfa835ef4db5180309829ee8e27a9":[1,0,0,35], -"namespacepcs.html#a79a822cea8e301fd51d2ed51dff57286":[1,0,0,9], -"namespacepcs.html#a8cb1cd0a1e39d92893eb7d22145f5d65":[1,0,0,37], -"namespacepcs.html#a965f285db4253ce86ed59fccc2e8be61":[1,0,0,43], -"namespacepcs.html#a9f0ba4e85fc273fad1a8b489f3be7fa8":[1,0,0,14], -"namespacepcs.html#aa36d34c2227cde5856e8d61fa6e4af58":[1,0,0,32], -"namespacepcs.html#aaf8dcc64819cbf8631fc63e0dd522811":[1,0,0,48], -"namespacepcs.html#ab097a99126055ab4c843eb6efb573bb1":[1,0,0,45], -"namespacepcs.html#ab5077443809e9e4eb7bfa463728f398a":[1,0,0,39], -"namespacepcs.html#ab823c7be920affd05f96a6ad8b99accf":[1,0,0,47], -"namespacepcs.html#abfda7874fe5b1f72c1c5a9a04d5c7e42":[1,0,0,21], -"namespacepcs.html#ac25d471fa1d838401335776ad4b6ead1":[1,0,0,38], -"namespacepcs.html#ac6e0b881e35c04e9b5bbe6e8b17ee1a7":[1,0,0,42], -"namespacepcs.html#ac7822fd0c570f69d597936a24c38ba2a":[1,0,0,13], -"namespacepcs.html#acab7e7bb1ffd6e4ea1a8300b05478647":[1,0,0,27], -"namespacepcs.html#acb7395de8ef88696d0c8c9772e172118":[1,0,0,41], -"namespacepcs.html#ad1d1b13c16ce784055e93af9fa34fb5c":[1,0,0,24], -"namespacepcs.html#ade5b26313fc856bb882109d6945629b8":[1,0,0,11], -"namespacepcs.html#aedd570e9ffa0572d56fce5085594bdbb":[1,0,0,22], -"namespacepcs.html#aef0240331a343bb1ad13eb613ca93fa4":[1,0,0,20], -"namespacepcs.html#af089ceadbeaab27e12ad7f7edaaec72a":[1,0,0,34], -"namespacepcs.html#af1b60c1081e8bc3b4cd91fbe240e9b87":[1,0,0,25], -"namespacepcs.html#af7c58514e3378a219904f22eb22e9072":[1,0,0,18], -"namespacepcs.html#afb8dd890fe893aba3264ac7df4fe7124":[1,0,0,40], -"namespaces.html":[1,0], -"pages.html":[], -"structpcs_1_1_start_slice.html":[1,0,0,2], -"structpcs_1_1_start_slice.html":[2,0,0,2], -"structpcs_1_1_start_slice.html#a6f792a61218b7598f8f6bb37dcdae56e":[1,0,0,2,1], -"structpcs_1_1_start_slice.html#a6f792a61218b7598f8f6bb37dcdae56e":[2,0,0,2,1], -"structpcs_1_1_start_slice.html#ae435a090e0d93fe221cab4822e352886":[1,0,0,2,0], -"structpcs_1_1_start_slice.html#ae435a090e0d93fe221cab4822e352886":[2,0,0,2,0], -"structpcs_1_1_start_step_slice.html":[1,0,0,3], -"structpcs_1_1_start_step_slice.html":[2,0,0,3], -"structpcs_1_1_start_step_slice.html#a438eef8b248cc00ed48afda08aff6d4c":[1,0,0,3,0], -"structpcs_1_1_start_step_slice.html#a438eef8b248cc00ed48afda08aff6d4c":[2,0,0,3,0], -"structpcs_1_1_start_step_slice.html#adc0aae8a3849379742e23c4f3a3197a9":[1,0,0,3,1], -"structpcs_1_1_start_step_slice.html#adc0aae8a3849379742e23c4f3a3197a9":[2,0,0,3,1], -"structpcs_1_1_start_stop_slice.html":[1,0,0,4], -"structpcs_1_1_start_stop_slice.html":[2,0,0,4], -"structpcs_1_1_start_stop_slice.html#a7c8ad9cb9d63fb9d56b3dbc9647297b4":[1,0,0,4,0], -"structpcs_1_1_start_stop_slice.html#a7c8ad9cb9d63fb9d56b3dbc9647297b4":[2,0,0,4,0], -"structpcs_1_1_start_stop_slice.html#a95df964c79860a475a63da3e56301ea7":[1,0,0,4,1], -"structpcs_1_1_start_stop_slice.html#a95df964c79860a475a63da3e56301ea7":[2,0,0,4,1], -"structpcs_1_1_step_slice.html":[1,0,0,5], -"structpcs_1_1_step_slice.html":[2,0,0,5], -"structpcs_1_1_step_slice.html#a93892e4d8f153a06a65e0cd13ebfa949":[1,0,0,5,1], -"structpcs_1_1_step_slice.html#a93892e4d8f153a06a65e0cd13ebfa949":[2,0,0,5,1], -"structpcs_1_1_step_slice.html#ad24accb58329f71457fbaf00fbbbf874":[1,0,0,5,0], -"structpcs_1_1_step_slice.html#ad24accb58329f71457fbaf00fbbbf874":[2,0,0,5,0], -"structpcs_1_1_stop_slice.html":[1,0,0,6], -"structpcs_1_1_stop_slice.html":[2,0,0,6], -"structpcs_1_1_stop_slice.html#a6e7e761a846ec00b1f24be9f83830f25":[1,0,0,6,1], -"structpcs_1_1_stop_slice.html#a6e7e761a846ec00b1f24be9f83830f25":[2,0,0,6,1], -"structpcs_1_1_stop_slice.html#a9d59c11b1bc398b71abc59b4071da379":[1,0,0,6,0], -"structpcs_1_1_stop_slice.html#a9d59c11b1bc398b71abc59b4071da379":[2,0,0,6,0], -"structpcs_1_1_stop_step_slice.html":[1,0,0,7], -"structpcs_1_1_stop_step_slice.html":[2,0,0,7], -"structpcs_1_1_stop_step_slice.html#a86288ad6b535b8b4d522e8173511c639":[1,0,0,7,0], -"structpcs_1_1_stop_step_slice.html#a86288ad6b535b8b4d522e8173511c639":[2,0,0,7,0], -"structpcs_1_1_stop_step_slice.html#aa62d3d31f646766a6ea2ef3cd9f91491":[1,0,0,7,1], -"structpcs_1_1_stop_step_slice.html#aa62d3d31f646766a6ea2ef3cd9f91491":[2,0,0,7,1] -}; diff --git a/cpp-strings/html/search/all_0.js b/cpp-strings/html/search/all_0.js deleted file mode 100644 index 7610c45..0000000 --- a/cpp-strings/html/search/all_0.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['0_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['0_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['0_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['0_20229_202025_2007_3',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['07_4',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] -]; diff --git a/cpp-strings/html/search/all_1.js b/cpp-strings/html/search/all_1.js deleted file mode 100644 index e34236a..0000000 --- a/cpp-strings/html/search/all_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['1_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['1_200_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['1_200_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] -]; diff --git a/cpp-strings/html/search/all_10.js b/cpp-strings/html/search/all_10.js deleted file mode 100644 index 3a8b493..0000000 --- a/cpp-strings/html/search/all_10.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['partition_0',['partition',['../classpcs_1_1_cpp_string_t.html#ac5f88b0fc1f33cda23c30cb1f3bc560f',1,'pcs::CppStringT']]], - ['parts_20in_20release_201_200_1',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['pcs_2',['pcs',['../namespacepcs.html',1,'']]], - ['python_20strings_3',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/all_15.js b/cpp-strings/html/search/all_15.js deleted file mode 100644 index a833894..0000000 --- a/cpp-strings/html/search/all_15.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['what_20if_20c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['where_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/all_2.js b/cpp-strings/html/search/all_2.js deleted file mode 100644 index 48bd79f..0000000 --- a/cpp-strings/html/search/all_2.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['2025_2007_0',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] -]; diff --git a/cpp-strings/html/search/all_3.js b/cpp-strings/html/search/all_3.js deleted file mode 100644 index 10a6632..0000000 --- a/cpp-strings/html/search/all_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/all_5.js b/cpp-strings/html/search/all_5.js deleted file mode 100644 index 89e53e5..0000000 --- a/cpp-strings/html/search/all_5.js +++ /dev/null @@ -1,16 +0,0 @@ -var searchData= -[ - ['c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['capitalize_1',['capitalize',['../classpcs_1_1_cpp_string_t.html#a48a00cca031b9c29d1912508e120a5f6',1,'pcs::CppStringT']]], - ['center_2',['center',['../classpcs_1_1_cpp_string_t.html#af18311d8608e71627bc85f96581e4dd3',1,'pcs::CppStringT']]], - ['contains_3',['contains',['../classpcs_1_1_cpp_string_t.html#a0674e29327353aabf83d0e207fed31ed',1,'pcs::CppStringT']]], - ['contains_5fn_4',['contains_n',['../classpcs_1_1_cpp_string_t.html#a031b05f290f589b2df52bb84252c27c7',1,'pcs::CppStringT']]], - ['count_5',['count',['../classpcs_1_1_cpp_string_t.html#a7beda74b4d5092845a970d51d01fe4bf',1,'pcs::CppStringT']]], - ['count_5fn_6',['count_n',['../classpcs_1_1_cpp_string_t.html#a76f97d56e1713182d5e85d58cd445d10',1,'pcs::CppStringT::count_n(const CppStringT &sub, const size_type start, const size_type length) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a59839e3b5a186c2554224dbf4528c1b4',1,'pcs::CppStringT::count_n(const CppStringT &sub, const size_type length) const noexcept']]], - ['cpp_20strings_7',['Library cpp-strings',['../index.html',1,'']]], - ['cppstring_8',['CppString',['../namespacepcs.html#a08d21c458d61442667df24212920d0d9',1,'pcs']]], - ['cppstringt_9',['CppStringT',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], - ['cppstringt_3c_20char_20_3e_10',['CppStringT< char >',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], - ['cppstringt_3c_20wchar_5ft_20_3e_11',['CppStringT< wchar_t >',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], - ['cppwstring_12',['CppWString',['../namespacepcs.html#a79a822cea8e301fd51d2ed51dff57286',1,'pcs']]] -]; diff --git a/cpp-strings/html/search/all_6.js b/cpp-strings/html/search/all_6.js deleted file mode 100644 index 534d42d..0000000 --- a/cpp-strings/html/search/all_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['documentation_0',['Documentation',['../index.html#autotoc_md9',1,'']]] -]; diff --git a/cpp-strings/html/search/all_a.js b/cpp-strings/html/search/all_a.js deleted file mode 100644 index 47a186c..0000000 --- a/cpp-strings/html/search/all_a.js +++ /dev/null @@ -1,52 +0,0 @@ -var searchData= -[ - ['if_20c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['in_20release_201_200_1',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['index_2',['index',['../classpcs_1_1_cpp_string_t.html#a277a2b8a3b93951ccb94b6bf39daa582',1,'pcs::CppStringT']]], - ['index_5fn_3',['index_n',['../classpcs_1_1_cpp_string_t.html#aee94d4b52483021051b168e776b18569',1,'pcs::CppStringT::index_n(const CppStringT &sub, const size_type start, const size_type count) const'],['../classpcs_1_1_cpp_string_t.html#a19a51054b824add817f30c5ff03effe7',1,'pcs::CppStringT::index_n(const CppStringT &sub, const size_type count) const']]], - ['intro_4',['Intro',['../index.html#autotoc_md4',1,'']]], - ['is_5falpha_5',['is_alpha',['../namespacepcs.html#a40bc3d234e3c737f34d267151ca62014',1,'pcs']]], - ['is_5falpha_3c_20char_20_3e_6',['is_alpha< char >',['../namespacepcs.html#ade5b26313fc856bb882109d6945629b8',1,'pcs']]], - ['is_5falpha_3c_20wchar_5ft_20_3e_7',['is_alpha< wchar_t >',['../namespacepcs.html#a069625790af3ecf05a424c2c53eabfc0',1,'pcs']]], - ['is_5fascii_8',['is_ascii',['../namespacepcs.html#ac7822fd0c570f69d597936a24c38ba2a',1,'pcs']]], - ['is_5fdecimal_9',['is_decimal',['../namespacepcs.html#a9f0ba4e85fc273fad1a8b489f3be7fa8',1,'pcs']]], - ['is_5fdecimal_3c_20char_20_3e_10',['is_decimal< char >',['../namespacepcs.html#a28f77929d599a862403a4471f6b73fc3',1,'pcs']]], - ['is_5fdecimal_3c_20wchar_5ft_20_3e_11',['is_decimal< wchar_t >',['../namespacepcs.html#a60a2017b25d3d06b83e72f5ed5a93d09',1,'pcs']]], - ['is_5fdigit_12',['is_digit',['../namespacepcs.html#a52b12f8beb4ab7d8b819ca24180e08d1',1,'pcs']]], - ['is_5fdigit_3c_20char_20_3e_13',['is_digit< char >',['../namespacepcs.html#af7c58514e3378a219904f22eb22e9072',1,'pcs']]], - ['is_5fdigit_3c_20wchar_5ft_20_3e_14',['is_digit< wchar_t >',['../namespacepcs.html#a01c6093b1a8ef52114f799635ff930d5',1,'pcs']]], - ['is_5fid_5fcontinue_15',['is_id_continue',['../namespacepcs.html#aef0240331a343bb1ad13eb613ca93fa4',1,'pcs']]], - ['is_5fid_5fstart_16',['is_id_start',['../namespacepcs.html#abfda7874fe5b1f72c1c5a9a04d5c7e42',1,'pcs']]], - ['is_5flower_17',['is_lower',['../namespacepcs.html#aedd570e9ffa0572d56fce5085594bdbb',1,'pcs']]], - ['is_5flower_3c_20char_20_3e_18',['is_lower< char >',['../namespacepcs.html#a29893984c95e53a6efe01f74c2dcc03a',1,'pcs']]], - ['is_5flower_3c_20wchar_5ft_20_3e_19',['is_lower< wchar_t >',['../namespacepcs.html#ad1d1b13c16ce784055e93af9fa34fb5c',1,'pcs']]], - ['is_5fnumeric_20',['is_numeric',['../namespacepcs.html#af1b60c1081e8bc3b4cd91fbe240e9b87',1,'pcs']]], - ['is_5fnumeric_3c_20char_20_3e_21',['is_numeric< char >',['../namespacepcs.html#a242e3c28e3d47d19d70ab70d83e74d35',1,'pcs']]], - ['is_5fnumeric_3c_20wchar_5ft_20_3e_22',['is_numeric< wchar_t >',['../namespacepcs.html#acab7e7bb1ffd6e4ea1a8300b05478647',1,'pcs']]], - ['is_5fprintable_23',['is_printable',['../namespacepcs.html#a51cd6883557ab31a1e0c8e7b5ab27351',1,'pcs']]], - ['is_5fprintable_3c_20char_20_3e_24',['is_printable< char >',['../namespacepcs.html#a1cd19ec212e3ada992a8effb8d5d872d',1,'pcs']]], - ['is_5fprintable_3c_20wchar_5ft_20_3e_25',['is_printable< wchar_t >',['../namespacepcs.html#a30ed0cd7942d081369f78a49a029d8b1',1,'pcs']]], - ['is_5fpunctuation_26',['is_punctuation',['../namespacepcs.html#a02d340dd9c510eda0fbfed07a08d0792',1,'pcs']]], - ['is_5fpunctuation_3c_20char_20_3e_27',['is_punctuation< char >',['../namespacepcs.html#aa36d34c2227cde5856e8d61fa6e4af58',1,'pcs']]], - ['is_5fpunctuation_3c_20wchar_5ft_20_3e_28',['is_punctuation< wchar_t >',['../namespacepcs.html#a363e2bac9c403a623c5a410f7113edd3',1,'pcs']]], - ['is_5fspace_29',['is_space',['../namespacepcs.html#af089ceadbeaab27e12ad7f7edaaec72a',1,'pcs']]], - ['is_5fspace_3c_20char_20_3e_30',['is_space< char >',['../namespacepcs.html#a714cfa835ef4db5180309829ee8e27a9',1,'pcs']]], - ['is_5fspace_3c_20wchar_5ft_20_3e_31',['is_space< wchar_t >',['../namespacepcs.html#a57a765c6eb624107a2176a56cf2220a7',1,'pcs']]], - ['is_5fupper_32',['is_upper',['../namespacepcs.html#a8cb1cd0a1e39d92893eb7d22145f5d65',1,'pcs']]], - ['is_5fupper_3c_20char_20_3e_33',['is_upper< char >',['../namespacepcs.html#ac25d471fa1d838401335776ad4b6ead1',1,'pcs']]], - ['is_5fupper_3c_20wchar_5ft_20_3e_34',['is_upper< wchar_t >',['../namespacepcs.html#ab5077443809e9e4eb7bfa463728f398a',1,'pcs']]], - ['is_5fwords_5fsep_35',['is_words_sep',['../classpcs_1_1_cpp_string_t.html#a7565e4f2958e485ee2b0815be1faa0fa',1,'pcs::CppStringT']]], - ['isalnum_36',['isalnum',['../classpcs_1_1_cpp_string_t.html#a8fdf96ffee524d5b795c4aad26ece6ae',1,'pcs::CppStringT']]], - ['isalpha_37',['isalpha',['../classpcs_1_1_cpp_string_t.html#a447b7c58b4be1cdcba3aedf189acbce7',1,'pcs::CppStringT']]], - ['isascii_38',['isascii',['../classpcs_1_1_cpp_string_t.html#a710631f31d4c63c2117e8f4804fad3f2',1,'pcs::CppStringT']]], - ['isdecimal_39',['isdecimal',['../classpcs_1_1_cpp_string_t.html#a0b9d8a55419274e7cfd9badb4df704e3',1,'pcs::CppStringT']]], - ['isdigit_40',['isdigit',['../classpcs_1_1_cpp_string_t.html#a21316d00180377a3f48910a6c4c43b9c',1,'pcs::CppStringT']]], - ['isidentifier_41',['isidentifier',['../classpcs_1_1_cpp_string_t.html#a91f72d425dbb4c53a066338d30683246',1,'pcs::CppStringT']]], - ['islower_42',['islower',['../classpcs_1_1_cpp_string_t.html#ae4ff448bb92e6499c0a76f7d8e11126c',1,'pcs::CppStringT']]], - ['isnumeric_43',['isnumeric',['../classpcs_1_1_cpp_string_t.html#a578176ed20fd8da965afbcae1d99dd59',1,'pcs::CppStringT']]], - ['isprintable_44',['isprintable',['../classpcs_1_1_cpp_string_t.html#a6257a1832da550d4be32e9f272e51265',1,'pcs::CppStringT']]], - ['ispunctuation_45',['ispunctuation',['../classpcs_1_1_cpp_string_t.html#a2842f3a067fdc674709bed048d64e12d',1,'pcs::CppStringT']]], - ['isspace_46',['isspace',['../classpcs_1_1_cpp_string_t.html#a959a8f56bb536f2474ffc649a7ad3290',1,'pcs::CppStringT']]], - ['istitle_47',['istitle',['../classpcs_1_1_cpp_string_t.html#ad72611f339c2b9027a72fa26f25748c3',1,'pcs::CppStringT']]], - ['isupper_48',['isupper',['../classpcs_1_1_cpp_string_t.html#af2784cbe9655bb8e23fe90375d79e69c',1,'pcs::CppStringT']]] -]; diff --git a/cpp-strings/html/search/all_d.js b/cpp-strings/html/search/all_d.js deleted file mode 100644 index 87ae8b8..0000000 --- a/cpp-strings/html/search/all_d.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['missing_20parts_20in_20release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_0.js b/cpp-strings/html/search/pages_0.js deleted file mode 100644 index 7610c45..0000000 --- a/cpp-strings/html/search/pages_0.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['0_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['0_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['0_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['0_20229_202025_2007_3',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['07_4',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_1.js b/cpp-strings/html/search/pages_1.js deleted file mode 100644 index e34236a..0000000 --- a/cpp-strings/html/search/pages_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['1_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['1_200_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['1_200_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_2.js b/cpp-strings/html/search/pages_2.js deleted file mode 100644 index 48bd79f..0000000 --- a/cpp-strings/html/search/pages_2.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['2025_2007_0',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_3.js b/cpp-strings/html/search/pages_3.js deleted file mode 100644 index 10a6632..0000000 --- a/cpp-strings/html/search/pages_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_4.js b/cpp-strings/html/search/pages_4.js deleted file mode 100644 index 8c2e7e6..0000000 --- a/cpp-strings/html/search/pages_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['cpp_20strings_1',['Library cpp-strings',['../index.html',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_5.js b/cpp-strings/html/search/pages_5.js deleted file mode 100644 index 534d42d..0000000 --- a/cpp-strings/html/search/pages_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['documentation_0',['Documentation',['../index.html#autotoc_md9',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_6.js b/cpp-strings/html/search/pages_6.js deleted file mode 100644 index 8ecbd2d..0000000 --- a/cpp-strings/html/search/pages_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_7.js b/cpp-strings/html/search/pages_7.js deleted file mode 100644 index bf51d68..0000000 --- a/cpp-strings/html/search/pages_7.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['if_20c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['in_20release_201_200_1',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['intro_2',['Intro',['../index.html#autotoc_md4',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_8.js b/cpp-strings/html/search/pages_8.js deleted file mode 100644 index 767d0b6..0000000 --- a/cpp-strings/html/search/pages_8.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['latest_20release_20release_201_200_201_200_200_20229_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['library_20cpp_20strings_1',['Library cpp-strings',['../index.html',1,'']]], - ['license_2',['License',['../index.html#autotoc_md3',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_9.js b/cpp-strings/html/search/pages_9.js deleted file mode 100644 index 87ae8b8..0000000 --- a/cpp-strings/html/search/pages_9.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['missing_20parts_20in_20release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_a.js b/cpp-strings/html/search/pages_a.js deleted file mode 100644 index 9f2f1fe..0000000 --- a/cpp-strings/html/search/pages_a.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['parts_20in_20release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_b.js b/cpp-strings/html/search/pages_b.js deleted file mode 100644 index 1768d4f..0000000 --- a/cpp-strings/html/search/pages_b.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['release_201_200_201_200_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['release_20release_201_200_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_c.js b/cpp-strings/html/search/pages_c.js deleted file mode 100644 index 95cc349..0000000 --- a/cpp-strings/html/search/pages_c.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['strings_0',['strings',['../index.html',1,'Library cpp-strings'],['../index.html#autotoc_md1',1,'What if c++ strings where as easy to use as Python strings?']]], - ['strings_20where_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_d.js b/cpp-strings/html/search/pages_d.js deleted file mode 100644 index 4f92957..0000000 --- a/cpp-strings/html/search/pages_d.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_e.js b/cpp-strings/html/search/pages_e.js deleted file mode 100644 index 4c7a727..0000000 --- a/cpp-strings/html/search/pages_e.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/search/pages_f.js b/cpp-strings/html/search/pages_f.js deleted file mode 100644 index a833894..0000000 --- a/cpp-strings/html/search/pages_f.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['what_20if_20c_20strings_20where_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['where_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] -]; diff --git a/cpp-strings/html/annotated.html b/documentation/annotated.html similarity index 99% rename from cpp-strings/html/annotated.html rename to documentation/annotated.html index cccc0e4..9b9a678 100644 --- a/cpp-strings/html/annotated.html +++ b/documentation/annotated.html @@ -26,7 +26,7 @@ -
      cpp-strings 1.0.0 +
      cpp-strings 1.0.4
      Pythonic c++ strings
      diff --git a/cpp-strings/html/annotated_dup.js b/documentation/annotated_dup.js similarity index 100% rename from cpp-strings/html/annotated_dup.js rename to documentation/annotated_dup.js diff --git a/cpp-strings/html/classes.html b/documentation/classes.html similarity index 99% rename from cpp-strings/html/classes.html rename to documentation/classes.html index cac03fe..b5312f5 100644 --- a/cpp-strings/html/classes.html +++ b/documentation/classes.html @@ -26,7 +26,7 @@ -
      cpp-strings 1.0.0 +
      cpp-strings 1.0.4
      Pythonic c++ strings
      diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t-members.html b/documentation/classpcs_1_1_cpp_string_t-members.html similarity index 99% rename from cpp-strings/html/classpcs_1_1_cpp_string_t-members.html rename to documentation/classpcs_1_1_cpp_string_t-members.html index 184420d..9ce290e 100644 --- a/cpp-strings/html/classpcs_1_1_cpp_string_t-members.html +++ b/documentation/classpcs_1_1_cpp_string_t-members.html @@ -26,7 +26,7 @@ -
      cpp-strings 1.0.0 +
      cpp-strings 1.0.4
      Pythonic c++ strings
      diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t.html b/documentation/classpcs_1_1_cpp_string_t.html similarity index 99% rename from cpp-strings/html/classpcs_1_1_cpp_string_t.html rename to documentation/classpcs_1_1_cpp_string_t.html index b8ec5fe..9842fe3 100644 --- a/cpp-strings/html/classpcs_1_1_cpp_string_t.html +++ b/documentation/classpcs_1_1_cpp_string_t.html @@ -26,7 +26,7 @@ -
      cpp-strings 1.0.0 +
      cpp-strings 1.0.4
      Pythonic c++ strings
      @@ -93,7 +93,7 @@

      This is the templated base class for all CppString classes. More...

      -

      #include <cppstrings.h>

      +

      #include <cppstrings.h>

      Inheritance diagram for pcs::CppStringT< CharT, TraitsT, AllocatorT >:
      @@ -1421,7 +1421,7 @@

      Returns true if all characters in the string are decimal characters and there is at least one character, or false otherwise.

      -

      Decimal characters are those that can be used to form numbers in base 10, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal character is a character in the Unicode General Category “Nd”.

      +

      Decimal characters are those that can be used to form numbers in base 10, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal character is a character in the Unicode General Category �Nd�.

      Referenced by pcs::CppStringT< char >::isdigit(), and pcs::CppStringT< char >::isnumeric().

      @@ -1488,7 +1488,7 @@

      https://www.unicode.org/reports/tr31/#NFKC_Modifications)> ID_Continue ::= ID_Start | <characters having the Unicode General_Category of nonspacing marks, spacing combining marks, decimal number, connector punctuation, plus Other_ID_Continue, minus Pattern_Syntax and Pattern_White_Space code points>

      the currently implemented rule is this simpler one:

      -

      identifier ::= ID_Start id_continue* id_continue ::= ID_Start | <decimal number>

      +

      identifier ::= ID_Start id_continue* id_continue ::= ID_Start | decimal_number

      @@ -3089,9 +3089,9 @@

      splitlines(), are currently NOT detected by CppStrings \x85 Next Line (C1 Control Code) \u2028 Line Separator \u2029 Paragraph Separator

      +

      This method splits on the following line boundaries. In particular, the boundaries are a superset of universal newlines: '
      +' Line Feed '\r' Carriage Return '\r
      +' Carriage Return + Line Feed '\v' or '\x0b' Line Tabulation '\f' or '\x0c' Form Feed '\x1c' File Separator '\x1d' Group Separator '\x1e' Record Separator Next separators values, detected by Python method splitlines(), are currently NOT detected by CppStrings '\x85' Next Line (C1 Control Code) '\u2028' Line Separator '\u2029' Paragraph Separator

      @@ -3622,7 +3622,7 @@

      cppstrings.h

    • +
    • cppstrings.h
    diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t.js b/documentation/classpcs_1_1_cpp_string_t.js similarity index 100% rename from cpp-strings/html/classpcs_1_1_cpp_string_t.js rename to documentation/classpcs_1_1_cpp_string_t.js diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t.png b/documentation/classpcs_1_1_cpp_string_t.png similarity index 100% rename from cpp-strings/html/classpcs_1_1_cpp_string_t.png rename to documentation/classpcs_1_1_cpp_string_t.png diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception-members.html b/documentation/classpcs_1_1_cpp_string_t_1_1_not_found_exception-members.html similarity index 99% rename from cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception-members.html rename to documentation/classpcs_1_1_cpp_string_t_1_1_not_found_exception-members.html index 96404b2..baeae4b 100644 --- a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception-members.html +++ b/documentation/classpcs_1_1_cpp_string_t_1_1_not_found_exception-members.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html b/documentation/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html similarity index 98% rename from cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html rename to documentation/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html index a96dad0..f2f0949 100644 --- a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html +++ b/documentation/classpcs_1_1_cpp_string_t_1_1_not_found_exception.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    @@ -109,7 +109,7 @@  NotFoundException (const std::string &what_arg)
    The documentation for this class was generated from the following file:
    diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.png b/documentation/classpcs_1_1_cpp_string_t_1_1_not_found_exception.png similarity index 100% rename from cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_not_found_exception.png rename to documentation/classpcs_1_1_cpp_string_t_1_1_not_found_exception.png diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html b/documentation/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html similarity index 99% rename from cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html rename to documentation/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html index 19c9850..c7461ac 100644 --- a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html +++ b/documentation/classpcs_1_1_cpp_string_t_1_1_trans_table-members.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.html b/documentation/classpcs_1_1_cpp_string_t_1_1_trans_table.html similarity index 99% rename from cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.html rename to documentation/classpcs_1_1_cpp_string_t_1_1_trans_table.html index b013f68..8fb7d87 100644 --- a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.html +++ b/documentation/classpcs_1_1_cpp_string_t_1_1_trans_table.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    @@ -93,7 +93,7 @@

    The internal class of translation tables, used with methods CppStringT::maketrans and CppStringT::translate. More...

    -

    #include <cppstrings.h>

    +

    #include <cppstrings.h>

    @@ -813,7 +813,7 @@

    cppstrings.h +
  • cppstrings.h
  • diff --git a/cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.js b/documentation/classpcs_1_1_cpp_string_t_1_1_trans_table.js similarity index 100% rename from cpp-strings/html/classpcs_1_1_cpp_string_t_1_1_trans_table.js rename to documentation/classpcs_1_1_cpp_string_t_1_1_trans_table.js diff --git a/cpp-strings/html/classpcs_1_1_slice-members.html b/documentation/classpcs_1_1_slice-members.html similarity index 99% rename from cpp-strings/html/classpcs_1_1_slice-members.html rename to documentation/classpcs_1_1_slice-members.html index b6e1a5f..3ec7eae 100644 --- a/cpp-strings/html/classpcs_1_1_slice-members.html +++ b/documentation/classpcs_1_1_slice-members.html @@ -26,7 +26,7 @@

    diff --git a/cpp-strings/html/classpcs_1_1_slice.html b/documentation/classpcs_1_1_slice.html similarity index 99% rename from cpp-strings/html/classpcs_1_1_slice.html rename to documentation/classpcs_1_1_slice.html index 3bbc794..5f6b5e7 100644 --- a/cpp-strings/html/classpcs_1_1_slice.html +++ b/documentation/classpcs_1_1_slice.html @@ -26,7 +26,7 @@ @@ -93,7 +93,7 @@

    Base class for slices, with start, stop and step specified values. More...

    -

    #include <cppstrings.h>

    +

    #include <cppstrings.h>

    Inheritance diagram for pcs::Slice< IntT >:
    @@ -462,7 +462,7 @@

    cppstrings.h +
  • cppstrings.h
  • diff --git a/cpp-strings/html/classpcs_1_1_slice.js b/documentation/classpcs_1_1_slice.js similarity index 100% rename from cpp-strings/html/classpcs_1_1_slice.js rename to documentation/classpcs_1_1_slice.js diff --git a/cpp-strings/html/classpcs_1_1_slice.png b/documentation/classpcs_1_1_slice.png similarity index 100% rename from cpp-strings/html/classpcs_1_1_slice.png rename to documentation/classpcs_1_1_slice.png diff --git a/cpp-strings/html/clipboard.js b/documentation/clipboard.js similarity index 100% rename from cpp-strings/html/clipboard.js rename to documentation/clipboard.js diff --git a/cpp-strings/html/cookie.js b/documentation/cookie.js similarity index 100% rename from cpp-strings/html/cookie.js rename to documentation/cookie.js diff --git a/cpp-strings/html/files.html b/documentation/dir_04560ed86add89973319438dcdff07f6.html similarity index 85% rename from cpp-strings/html/files.html rename to documentation/dir_04560ed86add89973319438dcdff07f6.html index c18cd38..499a1c7 100644 --- a/cpp-strings/html/files.html +++ b/documentation/dir_04560ed86add89973319438dcdff07f6.html @@ -5,7 +5,7 @@ -cpp-strings: File List +cpp-strings: cpp-strings Directory Reference @@ -26,7 +26,7 @@ @@ -60,7 +60,7 @@
    @@ -86,20 +86,23 @@
    -
    File List
    +
    cpp-strings Directory Reference
    -
    Here is a list of all documented files with brief descriptions:
    -

    Public Types

    -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    - -
     
    cppstrings.h
    -
    + diff --git a/cpp-strings/html/doxygen.css b/documentation/doxygen.css similarity index 99% rename from cpp-strings/html/doxygen.css rename to documentation/doxygen.css index 96ed5da..11fe334 100644 --- a/cpp-strings/html/doxygen.css +++ b/documentation/doxygen.css @@ -2442,7 +2442,7 @@ details[open]>summary::before { html { ---timestamp: 'Thu Jul 17 2025' +--timestamp: 'Tue Oct 21 2025' } span.timestamp { content: ' '; } span.timestamp:before { content: var(--timestamp); } diff --git a/cpp-strings/html/doxygen.svg b/documentation/doxygen.svg similarity index 100% rename from cpp-strings/html/doxygen.svg rename to documentation/doxygen.svg diff --git a/cpp-strings/html/doxygen_crawl.html b/documentation/doxygen_crawl.html similarity index 98% rename from cpp-strings/html/doxygen_crawl.html rename to documentation/doxygen_crawl.html index a13fd7d..b3bf7fc 100644 --- a/cpp-strings/html/doxygen_crawl.html +++ b/documentation/doxygen_crawl.html @@ -143,19 +143,12 @@ - + - - - - - - - diff --git a/cpp-strings/html/dynsections.js b/documentation/dynsections.js similarity index 100% rename from cpp-strings/html/dynsections.js rename to documentation/dynsections.js diff --git a/cpp-strings/html/functions.html b/documentation/functions.html similarity index 99% rename from cpp-strings/html/functions.html rename to documentation/functions.html index e99d012..e84db14 100644 --- a/cpp-strings/html/functions.html +++ b/documentation/functions.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/functions_func.html b/documentation/functions_func.html similarity index 99% rename from cpp-strings/html/functions_func.html rename to documentation/functions_func.html index ebc9f5d..bec5f4e 100644 --- a/cpp-strings/html/functions_func.html +++ b/documentation/functions_func.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/hierarchy.html b/documentation/hierarchy.html similarity index 99% rename from cpp-strings/html/hierarchy.html rename to documentation/hierarchy.html index 07a5967..fc6a8d7 100644 --- a/cpp-strings/html/hierarchy.html +++ b/documentation/hierarchy.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/hierarchy.js b/documentation/hierarchy.js similarity index 100% rename from cpp-strings/html/hierarchy.js rename to documentation/hierarchy.js diff --git a/documentation/index.html b/documentation/index.html new file mode 100644 index 0000000..77773cd --- /dev/null +++ b/documentation/index.html @@ -0,0 +1,103 @@ + + + + + + + +cpp-strings: Main Page + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    cpp-strings 1.0.4 +
    +
    Pythonic c++ strings
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + + + + diff --git a/cpp-strings/html/jquery.js b/documentation/jquery.js similarity index 100% rename from cpp-strings/html/jquery.js rename to documentation/jquery.js diff --git a/cpp-strings/html/menu.js b/documentation/menu.js similarity index 100% rename from cpp-strings/html/menu.js rename to documentation/menu.js diff --git a/cpp-strings/html/menudata.js b/documentation/menudata.js similarity index 96% rename from cpp-strings/html/menudata.js rename to documentation/menudata.js index 2d950f2..1f41ba2 100644 --- a/cpp-strings/html/menudata.js +++ b/documentation/menudata.js @@ -77,6 +77,4 @@ var menudata={children:[ {text:"t",url:"functions_func.html#index_t"}, {text:"u",url:"functions_func.html#index_u"}, {text:"z",url:"functions_func.html#index_z"}, -{text:"~",url:"functions_func.html#index__7E"}]}]}]}, -{text:"Files",url:"files.html",children:[ -{text:"File List",url:"files.html"}]}]} +{text:"~",url:"functions_func.html#index__7E"}]}]}]}]} diff --git a/cpp-strings/html/namespacemembers.html b/documentation/namespacemembers.html similarity index 99% rename from cpp-strings/html/namespacemembers.html rename to documentation/namespacemembers.html index e29a627..bb12bb4 100644 --- a/cpp-strings/html/namespacemembers.html +++ b/documentation/namespacemembers.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/namespacemembers_func.html b/documentation/namespacemembers_func.html similarity index 99% rename from cpp-strings/html/namespacemembers_func.html rename to documentation/namespacemembers_func.html index 99524ea..af6e5ae 100644 --- a/cpp-strings/html/namespacemembers_func.html +++ b/documentation/namespacemembers_func.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/namespacemembers_type.html b/documentation/namespacemembers_type.html similarity index 99% rename from cpp-strings/html/namespacemembers_type.html rename to documentation/namespacemembers_type.html index d66a60f..6c18b1d 100644 --- a/cpp-strings/html/namespacemembers_type.html +++ b/documentation/namespacemembers_type.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/namespacepcs.html b/documentation/namespacepcs.html similarity index 99% rename from cpp-strings/html/namespacepcs.html rename to documentation/namespacepcs.html index c490840..7bcffed 100644 --- a/cpp-strings/html/namespacepcs.html +++ b/documentation/namespacepcs.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/namespacepcs.js b/documentation/namespacepcs.js similarity index 100% rename from cpp-strings/html/namespacepcs.js rename to documentation/namespacepcs.js diff --git a/cpp-strings/html/namespaces.html b/documentation/namespaces.html similarity index 99% rename from cpp-strings/html/namespaces.html rename to documentation/namespaces.html index 9d8281c..1a59ece 100644 --- a/cpp-strings/html/namespaces.html +++ b/documentation/namespaces.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/namespaces_dup.js b/documentation/namespaces_dup.js similarity index 100% rename from cpp-strings/html/namespaces_dup.js rename to documentation/namespaces_dup.js diff --git a/cpp-strings/html/navtree.css b/documentation/navtree.css similarity index 100% rename from cpp-strings/html/navtree.css rename to documentation/navtree.css diff --git a/cpp-strings/html/navtree.js b/documentation/navtree.js similarity index 100% rename from cpp-strings/html/navtree.js rename to documentation/navtree.js diff --git a/cpp-strings/html/navtreedata.js b/documentation/navtreedata.js similarity index 94% rename from cpp-strings/html/navtreedata.js rename to documentation/navtreedata.js index 81b2279..5a58e34 100644 --- a/cpp-strings/html/navtreedata.js +++ b/documentation/navtreedata.js @@ -25,7 +25,6 @@ var NAVTREE = [ [ "cpp-strings", "index.html", [ - [ "Library cpp-strings", "index.html", "index" ], [ "Namespaces", "namespaces.html", [ [ "Namespace List", "namespaces.html", "namespaces_dup" ], [ "Namespace Members", "namespacemembers.html", [ @@ -42,9 +41,6 @@ var NAVTREE = [ "All", "functions.html", null ], [ "Functions", "functions_func.html", null ] ] ] - ] ], - [ "Files", "files.html", [ - [ "File List", "files.html", "files_dup" ] ] ] ] ] ]; diff --git a/cpp-strings/html/navtreeindex0.js b/documentation/navtreeindex0.js similarity index 86% rename from cpp-strings/html/navtreeindex0.js rename to documentation/navtreeindex0.js index 2fa314a..8ef868c 100644 --- a/cpp-strings/html/navtreeindex0.js +++ b/documentation/navtreeindex0.js @@ -1,253 +1,253 @@ var NAVTREEINDEX0 = { -"annotated.html":[2,0], -"classes.html":[2,1], +"annotated.html":[1,0], +"classes.html":[1,1], +"classpcs_1_1_cpp_string_t.html":[0,0,0,0], "classpcs_1_1_cpp_string_t.html":[1,0,0,0], -"classpcs_1_1_cpp_string_t.html":[2,0,0,0], +"classpcs_1_1_cpp_string_t.html#a02919129cdf158e75eae1e9815a071bf":[0,0,0,0,89], "classpcs_1_1_cpp_string_t.html#a02919129cdf158e75eae1e9815a071bf":[1,0,0,0,89], -"classpcs_1_1_cpp_string_t.html#a02919129cdf158e75eae1e9815a071bf":[2,0,0,0,89], +"classpcs_1_1_cpp_string_t.html#a031b05f290f589b2df52bb84252c27c7":[0,0,0,0,5], "classpcs_1_1_cpp_string_t.html#a031b05f290f589b2df52bb84252c27c7":[1,0,0,0,5], -"classpcs_1_1_cpp_string_t.html#a031b05f290f589b2df52bb84252c27c7":[2,0,0,0,5], +"classpcs_1_1_cpp_string_t.html#a0419f46de6fa532372f3b97b4927ebab":[0,0,0,0,71], "classpcs_1_1_cpp_string_t.html#a0419f46de6fa532372f3b97b4927ebab":[1,0,0,0,71], -"classpcs_1_1_cpp_string_t.html#a0419f46de6fa532372f3b97b4927ebab":[2,0,0,0,71], +"classpcs_1_1_cpp_string_t.html#a058704b7f4538ec9e1798c5348d37c7a":[0,0,0,0,55], "classpcs_1_1_cpp_string_t.html#a058704b7f4538ec9e1798c5348d37c7a":[1,0,0,0,55], -"classpcs_1_1_cpp_string_t.html#a058704b7f4538ec9e1798c5348d37c7a":[2,0,0,0,55], +"classpcs_1_1_cpp_string_t.html#a0674e29327353aabf83d0e207fed31ed":[0,0,0,0,4], "classpcs_1_1_cpp_string_t.html#a0674e29327353aabf83d0e207fed31ed":[1,0,0,0,4], -"classpcs_1_1_cpp_string_t.html#a0674e29327353aabf83d0e207fed31ed":[2,0,0,0,4], +"classpcs_1_1_cpp_string_t.html#a0995f5b5a01af3f4a749949e23d0d780":[0,0,0,0,51], "classpcs_1_1_cpp_string_t.html#a0995f5b5a01af3f4a749949e23d0d780":[1,0,0,0,51], -"classpcs_1_1_cpp_string_t.html#a0995f5b5a01af3f4a749949e23d0d780":[2,0,0,0,51], +"classpcs_1_1_cpp_string_t.html#a0b9d8a55419274e7cfd9badb4df704e3":[0,0,0,0,30], "classpcs_1_1_cpp_string_t.html#a0b9d8a55419274e7cfd9badb4df704e3":[1,0,0,0,30], -"classpcs_1_1_cpp_string_t.html#a0b9d8a55419274e7cfd9badb4df704e3":[2,0,0,0,30], +"classpcs_1_1_cpp_string_t.html#a0bd53df14569c307b5ca50a2e1e62960":[0,0,0,0,80], "classpcs_1_1_cpp_string_t.html#a0bd53df14569c307b5ca50a2e1e62960":[1,0,0,0,80], -"classpcs_1_1_cpp_string_t.html#a0bd53df14569c307b5ca50a2e1e62960":[2,0,0,0,80], +"classpcs_1_1_cpp_string_t.html#a0daec57ccab4601f46e9d1c258407765":[0,0,0,0,49], "classpcs_1_1_cpp_string_t.html#a0daec57ccab4601f46e9d1c258407765":[1,0,0,0,49], -"classpcs_1_1_cpp_string_t.html#a0daec57ccab4601f46e9d1c258407765":[2,0,0,0,49], +"classpcs_1_1_cpp_string_t.html#a12bc043347f555b4701e0c70d972058d":[0,0,0,0,88], "classpcs_1_1_cpp_string_t.html#a12bc043347f555b4701e0c70d972058d":[1,0,0,0,88], -"classpcs_1_1_cpp_string_t.html#a12bc043347f555b4701e0c70d972058d":[2,0,0,0,88], +"classpcs_1_1_cpp_string_t.html#a179634aafb049e8604ca78f813684a28":[0,0,0,0,92], "classpcs_1_1_cpp_string_t.html#a179634aafb049e8604ca78f813684a28":[1,0,0,0,92], -"classpcs_1_1_cpp_string_t.html#a179634aafb049e8604ca78f813684a28":[2,0,0,0,92], +"classpcs_1_1_cpp_string_t.html#a19a51054b824add817f30c5ff03effe7":[0,0,0,0,24], "classpcs_1_1_cpp_string_t.html#a19a51054b824add817f30c5ff03effe7":[1,0,0,0,24], -"classpcs_1_1_cpp_string_t.html#a19a51054b824add817f30c5ff03effe7":[2,0,0,0,24], +"classpcs_1_1_cpp_string_t.html#a1a89389b38fd6af3ea8db3489dd82f70":[0,0,0,0,20], "classpcs_1_1_cpp_string_t.html#a1a89389b38fd6af3ea8db3489dd82f70":[1,0,0,0,20], -"classpcs_1_1_cpp_string_t.html#a1a89389b38fd6af3ea8db3489dd82f70":[2,0,0,0,20], +"classpcs_1_1_cpp_string_t.html#a1fa8862a5f306553d6f0dae7e76fce83":[0,0,0,0,50], "classpcs_1_1_cpp_string_t.html#a1fa8862a5f306553d6f0dae7e76fce83":[1,0,0,0,50], -"classpcs_1_1_cpp_string_t.html#a1fa8862a5f306553d6f0dae7e76fce83":[2,0,0,0,50], +"classpcs_1_1_cpp_string_t.html#a21316d00180377a3f48910a6c4c43b9c":[0,0,0,0,31], "classpcs_1_1_cpp_string_t.html#a21316d00180377a3f48910a6c4c43b9c":[1,0,0,0,31], -"classpcs_1_1_cpp_string_t.html#a21316d00180377a3f48910a6c4c43b9c":[2,0,0,0,31], +"classpcs_1_1_cpp_string_t.html#a24c4b7a0f713373cb3287d92289562ad":[0,0,0,0,17], "classpcs_1_1_cpp_string_t.html#a24c4b7a0f713373cb3287d92289562ad":[1,0,0,0,17], -"classpcs_1_1_cpp_string_t.html#a24c4b7a0f713373cb3287d92289562ad":[2,0,0,0,17], +"classpcs_1_1_cpp_string_t.html#a277a2b8a3b93951ccb94b6bf39daa582":[0,0,0,0,23], "classpcs_1_1_cpp_string_t.html#a277a2b8a3b93951ccb94b6bf39daa582":[1,0,0,0,23], -"classpcs_1_1_cpp_string_t.html#a277a2b8a3b93951ccb94b6bf39daa582":[2,0,0,0,23], +"classpcs_1_1_cpp_string_t.html#a2842f3a067fdc674709bed048d64e12d":[0,0,0,0,36], "classpcs_1_1_cpp_string_t.html#a2842f3a067fdc674709bed048d64e12d":[1,0,0,0,36], -"classpcs_1_1_cpp_string_t.html#a2842f3a067fdc674709bed048d64e12d":[2,0,0,0,36], +"classpcs_1_1_cpp_string_t.html#a2a8c1e78b93da9a0abe471c7a8d85090":[0,0,0,0,93], "classpcs_1_1_cpp_string_t.html#a2a8c1e78b93da9a0abe471c7a8d85090":[1,0,0,0,93], -"classpcs_1_1_cpp_string_t.html#a2a8c1e78b93da9a0abe471c7a8d85090":[2,0,0,0,93], +"classpcs_1_1_cpp_string_t.html#a2baca0ddff848de56a7b867f68d3efab":[0,0,0,0,64], "classpcs_1_1_cpp_string_t.html#a2baca0ddff848de56a7b867f68d3efab":[1,0,0,0,64], -"classpcs_1_1_cpp_string_t.html#a2baca0ddff848de56a7b867f68d3efab":[2,0,0,0,64], +"classpcs_1_1_cpp_string_t.html#a2cc04d5062162ff5f7b6111d6f1e78e8":[0,0,0,0,16], "classpcs_1_1_cpp_string_t.html#a2cc04d5062162ff5f7b6111d6f1e78e8":[1,0,0,0,16], -"classpcs_1_1_cpp_string_t.html#a2cc04d5062162ff5f7b6111d6f1e78e8":[2,0,0,0,16], +"classpcs_1_1_cpp_string_t.html#a30860a043574996d85c80e49ef618594":[0,0,0,0,42], "classpcs_1_1_cpp_string_t.html#a30860a043574996d85c80e49ef618594":[1,0,0,0,42], -"classpcs_1_1_cpp_string_t.html#a30860a043574996d85c80e49ef618594":[2,0,0,0,42], +"classpcs_1_1_cpp_string_t.html#a30e26a3082ad50d01c7d0d98cb9e9c37":[0,0,0,0,52], "classpcs_1_1_cpp_string_t.html#a30e26a3082ad50d01c7d0d98cb9e9c37":[1,0,0,0,52], -"classpcs_1_1_cpp_string_t.html#a30e26a3082ad50d01c7d0d98cb9e9c37":[2,0,0,0,52], +"classpcs_1_1_cpp_string_t.html#a326eb96e19c3559a84af86ff1bf54aa4":[0,0,0,0,84], "classpcs_1_1_cpp_string_t.html#a326eb96e19c3559a84af86ff1bf54aa4":[1,0,0,0,84], -"classpcs_1_1_cpp_string_t.html#a326eb96e19c3559a84af86ff1bf54aa4":[2,0,0,0,84], +"classpcs_1_1_cpp_string_t.html#a3aa66706e268bd570a0084d70dff5cde":[0,0,0,0,73], "classpcs_1_1_cpp_string_t.html#a3aa66706e268bd570a0084d70dff5cde":[1,0,0,0,73], -"classpcs_1_1_cpp_string_t.html#a3aa66706e268bd570a0084d70dff5cde":[2,0,0,0,73], +"classpcs_1_1_cpp_string_t.html#a3b7955f9c7f9452a6a025caaaf0e6d73":[0,0,0,0,86], "classpcs_1_1_cpp_string_t.html#a3b7955f9c7f9452a6a025caaaf0e6d73":[1,0,0,0,86], -"classpcs_1_1_cpp_string_t.html#a3b7955f9c7f9452a6a025caaaf0e6d73":[2,0,0,0,86], +"classpcs_1_1_cpp_string_t.html#a3e9da0bfa54e84420e81668f6ce7f52c":[0,0,0,0,9], "classpcs_1_1_cpp_string_t.html#a3e9da0bfa54e84420e81668f6ce7f52c":[1,0,0,0,9], -"classpcs_1_1_cpp_string_t.html#a3e9da0bfa54e84420e81668f6ce7f52c":[2,0,0,0,9], +"classpcs_1_1_cpp_string_t.html#a42f1e87d7f1903536ee79aa058d5c867":[0,0,0,0,11], "classpcs_1_1_cpp_string_t.html#a42f1e87d7f1903536ee79aa058d5c867":[1,0,0,0,11], -"classpcs_1_1_cpp_string_t.html#a42f1e87d7f1903536ee79aa058d5c867":[2,0,0,0,11], +"classpcs_1_1_cpp_string_t.html#a447b7c58b4be1cdcba3aedf189acbce7":[0,0,0,0,28], "classpcs_1_1_cpp_string_t.html#a447b7c58b4be1cdcba3aedf189acbce7":[1,0,0,0,28], -"classpcs_1_1_cpp_string_t.html#a447b7c58b4be1cdcba3aedf189acbce7":[2,0,0,0,28], +"classpcs_1_1_cpp_string_t.html#a48a00cca031b9c29d1912508e120a5f6":[0,0,0,0,2], "classpcs_1_1_cpp_string_t.html#a48a00cca031b9c29d1912508e120a5f6":[1,0,0,0,2], -"classpcs_1_1_cpp_string_t.html#a48a00cca031b9c29d1912508e120a5f6":[2,0,0,0,2], +"classpcs_1_1_cpp_string_t.html#a4fd91047ab0126c823aa391a699e03bf":[0,0,0,0,15], "classpcs_1_1_cpp_string_t.html#a4fd91047ab0126c823aa391a699e03bf":[1,0,0,0,15], -"classpcs_1_1_cpp_string_t.html#a4fd91047ab0126c823aa391a699e03bf":[2,0,0,0,15], +"classpcs_1_1_cpp_string_t.html#a519a292eb3f0790d54a59a201f2d6410":[0,0,0,0,62], "classpcs_1_1_cpp_string_t.html#a519a292eb3f0790d54a59a201f2d6410":[1,0,0,0,62], -"classpcs_1_1_cpp_string_t.html#a519a292eb3f0790d54a59a201f2d6410":[2,0,0,0,62], +"classpcs_1_1_cpp_string_t.html#a545d669bb9296b5695b01ac8680bf3f4":[0,0,0,0,41], "classpcs_1_1_cpp_string_t.html#a545d669bb9296b5695b01ac8680bf3f4":[1,0,0,0,41], -"classpcs_1_1_cpp_string_t.html#a545d669bb9296b5695b01ac8680bf3f4":[2,0,0,0,41], +"classpcs_1_1_cpp_string_t.html#a546105cc9a8a9d493979c30607092cf1":[0,0,0,0,63], "classpcs_1_1_cpp_string_t.html#a546105cc9a8a9d493979c30607092cf1":[1,0,0,0,63], -"classpcs_1_1_cpp_string_t.html#a546105cc9a8a9d493979c30607092cf1":[2,0,0,0,63], +"classpcs_1_1_cpp_string_t.html#a55a3fa32de834f644ac28d7c2495fa77":[0,0,0,0,78], "classpcs_1_1_cpp_string_t.html#a55a3fa32de834f644ac28d7c2495fa77":[1,0,0,0,78], -"classpcs_1_1_cpp_string_t.html#a55a3fa32de834f644ac28d7c2495fa77":[2,0,0,0,78], +"classpcs_1_1_cpp_string_t.html#a578176ed20fd8da965afbcae1d99dd59":[0,0,0,0,34], "classpcs_1_1_cpp_string_t.html#a578176ed20fd8da965afbcae1d99dd59":[1,0,0,0,34], -"classpcs_1_1_cpp_string_t.html#a578176ed20fd8da965afbcae1d99dd59":[2,0,0,0,34], +"classpcs_1_1_cpp_string_t.html#a59839e3b5a186c2554224dbf4528c1b4":[0,0,0,0,7], "classpcs_1_1_cpp_string_t.html#a59839e3b5a186c2554224dbf4528c1b4":[1,0,0,0,7], -"classpcs_1_1_cpp_string_t.html#a59839e3b5a186c2554224dbf4528c1b4":[2,0,0,0,7], +"classpcs_1_1_cpp_string_t.html#a5a131c385a01ccc5410d4cffa55cf700":[0,0,0,0,83], "classpcs_1_1_cpp_string_t.html#a5a131c385a01ccc5410d4cffa55cf700":[1,0,0,0,83], -"classpcs_1_1_cpp_string_t.html#a5a131c385a01ccc5410d4cffa55cf700":[2,0,0,0,83], +"classpcs_1_1_cpp_string_t.html#a5caecc371bf390272283ceb7a15c6c1d":[0,0,0,0,21], "classpcs_1_1_cpp_string_t.html#a5caecc371bf390272283ceb7a15c6c1d":[1,0,0,0,21], -"classpcs_1_1_cpp_string_t.html#a5caecc371bf390272283ceb7a15c6c1d":[2,0,0,0,21], +"classpcs_1_1_cpp_string_t.html#a61674ee4e97038d82ea7ecc30b1761f6":[0,0,0,0,69], "classpcs_1_1_cpp_string_t.html#a61674ee4e97038d82ea7ecc30b1761f6":[1,0,0,0,69], -"classpcs_1_1_cpp_string_t.html#a61674ee4e97038d82ea7ecc30b1761f6":[2,0,0,0,69], +"classpcs_1_1_cpp_string_t.html#a619935926ef961883e9bbd92b2fc23bd":[0,0,0,0,13], "classpcs_1_1_cpp_string_t.html#a619935926ef961883e9bbd92b2fc23bd":[1,0,0,0,13], -"classpcs_1_1_cpp_string_t.html#a619935926ef961883e9bbd92b2fc23bd":[2,0,0,0,13], +"classpcs_1_1_cpp_string_t.html#a61fd4215938ec9f0fce1f885d6bb4a2b":[0,0,0,0,68], "classpcs_1_1_cpp_string_t.html#a61fd4215938ec9f0fce1f885d6bb4a2b":[1,0,0,0,68], -"classpcs_1_1_cpp_string_t.html#a61fd4215938ec9f0fce1f885d6bb4a2b":[2,0,0,0,68], +"classpcs_1_1_cpp_string_t.html#a6257a1832da550d4be32e9f272e51265":[0,0,0,0,35], "classpcs_1_1_cpp_string_t.html#a6257a1832da550d4be32e9f272e51265":[1,0,0,0,35], -"classpcs_1_1_cpp_string_t.html#a6257a1832da550d4be32e9f272e51265":[2,0,0,0,35], +"classpcs_1_1_cpp_string_t.html#a6693ec49258c6ac80a7875b3ebf3c916":[0,0,0,0,65], "classpcs_1_1_cpp_string_t.html#a6693ec49258c6ac80a7875b3ebf3c916":[1,0,0,0,65], -"classpcs_1_1_cpp_string_t.html#a6693ec49258c6ac80a7875b3ebf3c916":[2,0,0,0,65], +"classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120":[0,0,0,0,94], "classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120":[1,0,0,0,94], -"classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120":[2,0,0,0,94], +"classpcs_1_1_cpp_string_t.html#a6ab02b4d1c8093a5dfc089a45427f63c":[0,0,0,0,91], "classpcs_1_1_cpp_string_t.html#a6ab02b4d1c8093a5dfc089a45427f63c":[1,0,0,0,91], -"classpcs_1_1_cpp_string_t.html#a6ab02b4d1c8093a5dfc089a45427f63c":[2,0,0,0,91], +"classpcs_1_1_cpp_string_t.html#a6b0bc87b284120d0d3bfc685984997c0":[0,0,0,0,18], "classpcs_1_1_cpp_string_t.html#a6b0bc87b284120d0d3bfc685984997c0":[1,0,0,0,18], -"classpcs_1_1_cpp_string_t.html#a6b0bc87b284120d0d3bfc685984997c0":[2,0,0,0,18], +"classpcs_1_1_cpp_string_t.html#a6b23210d7d5eb07c9f942d62cc76b05e":[0,0,0,0,10], "classpcs_1_1_cpp_string_t.html#a6b23210d7d5eb07c9f942d62cc76b05e":[1,0,0,0,10], -"classpcs_1_1_cpp_string_t.html#a6b23210d7d5eb07c9f942d62cc76b05e":[2,0,0,0,10], +"classpcs_1_1_cpp_string_t.html#a710631f31d4c63c2117e8f4804fad3f2":[0,0,0,0,29], "classpcs_1_1_cpp_string_t.html#a710631f31d4c63c2117e8f4804fad3f2":[1,0,0,0,29], -"classpcs_1_1_cpp_string_t.html#a710631f31d4c63c2117e8f4804fad3f2":[2,0,0,0,29], +"classpcs_1_1_cpp_string_t.html#a7565e4f2958e485ee2b0815be1faa0fa":[0,0,0,0,26], "classpcs_1_1_cpp_string_t.html#a7565e4f2958e485ee2b0815be1faa0fa":[1,0,0,0,26], -"classpcs_1_1_cpp_string_t.html#a7565e4f2958e485ee2b0815be1faa0fa":[2,0,0,0,26], +"classpcs_1_1_cpp_string_t.html#a76f97d56e1713182d5e85d58cd445d10":[0,0,0,0,8], "classpcs_1_1_cpp_string_t.html#a76f97d56e1713182d5e85d58cd445d10":[1,0,0,0,8], -"classpcs_1_1_cpp_string_t.html#a76f97d56e1713182d5e85d58cd445d10":[2,0,0,0,8], +"classpcs_1_1_cpp_string_t.html#a790f663f51dfe6e9e15d4f5f025bf107":[0,0,0,0,61], "classpcs_1_1_cpp_string_t.html#a790f663f51dfe6e9e15d4f5f025bf107":[1,0,0,0,61], -"classpcs_1_1_cpp_string_t.html#a790f663f51dfe6e9e15d4f5f025bf107":[2,0,0,0,61], +"classpcs_1_1_cpp_string_t.html#a7beda74b4d5092845a970d51d01fe4bf":[0,0,0,0,6], "classpcs_1_1_cpp_string_t.html#a7beda74b4d5092845a970d51d01fe4bf":[1,0,0,0,6], -"classpcs_1_1_cpp_string_t.html#a7beda74b4d5092845a970d51d01fe4bf":[2,0,0,0,6], +"classpcs_1_1_cpp_string_t.html#a7ca47096b03baa0091c3b0349d210931":[0,0,0,0,76], "classpcs_1_1_cpp_string_t.html#a7ca47096b03baa0091c3b0349d210931":[1,0,0,0,76], -"classpcs_1_1_cpp_string_t.html#a7ca47096b03baa0091c3b0349d210931":[2,0,0,0,76], +"classpcs_1_1_cpp_string_t.html#a7eca5636b598c6fc107452ddd04a2f17":[0,0,0,0,14], "classpcs_1_1_cpp_string_t.html#a7eca5636b598c6fc107452ddd04a2f17":[1,0,0,0,14], -"classpcs_1_1_cpp_string_t.html#a7eca5636b598c6fc107452ddd04a2f17":[2,0,0,0,14], +"classpcs_1_1_cpp_string_t.html#a810a3a27ee7396f9c472648978327a76":[0,0,0,0,53], "classpcs_1_1_cpp_string_t.html#a810a3a27ee7396f9c472648978327a76":[1,0,0,0,53], -"classpcs_1_1_cpp_string_t.html#a810a3a27ee7396f9c472648978327a76":[2,0,0,0,53], +"classpcs_1_1_cpp_string_t.html#a8111cd357773d304fbb496571d7ee6be":[0,0,0,0,70], "classpcs_1_1_cpp_string_t.html#a8111cd357773d304fbb496571d7ee6be":[1,0,0,0,70], -"classpcs_1_1_cpp_string_t.html#a8111cd357773d304fbb496571d7ee6be":[2,0,0,0,70], +"classpcs_1_1_cpp_string_t.html#a86f8c78b2eeb3541fb6b56b4f4ac237b":[0,0,0,0,74], "classpcs_1_1_cpp_string_t.html#a86f8c78b2eeb3541fb6b56b4f4ac237b":[1,0,0,0,74], -"classpcs_1_1_cpp_string_t.html#a86f8c78b2eeb3541fb6b56b4f4ac237b":[2,0,0,0,74], +"classpcs_1_1_cpp_string_t.html#a87b25fce2a05421efd718c599a784a09":[0,0,0,0,12], "classpcs_1_1_cpp_string_t.html#a87b25fce2a05421efd718c599a784a09":[1,0,0,0,12], -"classpcs_1_1_cpp_string_t.html#a87b25fce2a05421efd718c599a784a09":[2,0,0,0,12], +"classpcs_1_1_cpp_string_t.html#a89e850d45d6dec167e763cf748a06971":[0,0,0,0,75], "classpcs_1_1_cpp_string_t.html#a89e850d45d6dec167e763cf748a06971":[1,0,0,0,75], -"classpcs_1_1_cpp_string_t.html#a89e850d45d6dec167e763cf748a06971":[2,0,0,0,75], +"classpcs_1_1_cpp_string_t.html#a8fa2afe84d7fc26f96bbd55f4266df2a":[0,0,0,0,79], "classpcs_1_1_cpp_string_t.html#a8fa2afe84d7fc26f96bbd55f4266df2a":[1,0,0,0,79], -"classpcs_1_1_cpp_string_t.html#a8fa2afe84d7fc26f96bbd55f4266df2a":[2,0,0,0,79], +"classpcs_1_1_cpp_string_t.html#a8fdf96ffee524d5b795c4aad26ece6ae":[0,0,0,0,27], "classpcs_1_1_cpp_string_t.html#a8fdf96ffee524d5b795c4aad26ece6ae":[1,0,0,0,27], -"classpcs_1_1_cpp_string_t.html#a8fdf96ffee524d5b795c4aad26ece6ae":[2,0,0,0,27], +"classpcs_1_1_cpp_string_t.html#a91f72d425dbb4c53a066338d30683246":[0,0,0,0,32], "classpcs_1_1_cpp_string_t.html#a91f72d425dbb4c53a066338d30683246":[1,0,0,0,32], -"classpcs_1_1_cpp_string_t.html#a91f72d425dbb4c53a066338d30683246":[2,0,0,0,32], +"classpcs_1_1_cpp_string_t.html#a944e066f3a863c354a5613a6eda17374":[0,0,0,0,22], "classpcs_1_1_cpp_string_t.html#a944e066f3a863c354a5613a6eda17374":[1,0,0,0,22], -"classpcs_1_1_cpp_string_t.html#a944e066f3a863c354a5613a6eda17374":[2,0,0,0,22], +"classpcs_1_1_cpp_string_t.html#a959a8f56bb536f2474ffc649a7ad3290":[0,0,0,0,37], "classpcs_1_1_cpp_string_t.html#a959a8f56bb536f2474ffc649a7ad3290":[1,0,0,0,37], -"classpcs_1_1_cpp_string_t.html#a959a8f56bb536f2474ffc649a7ad3290":[2,0,0,0,37], +"classpcs_1_1_cpp_string_t.html#a9debc70420a3fbc7722e3111aeccd819":[0,0,0,0,90], "classpcs_1_1_cpp_string_t.html#a9debc70420a3fbc7722e3111aeccd819":[1,0,0,0,90], -"classpcs_1_1_cpp_string_t.html#a9debc70420a3fbc7722e3111aeccd819":[2,0,0,0,90], +"classpcs_1_1_cpp_string_t.html#a9eed3f6c5e09f98f3d5916cc5b3a4311":[0,0,0,0,44], "classpcs_1_1_cpp_string_t.html#a9eed3f6c5e09f98f3d5916cc5b3a4311":[1,0,0,0,44], -"classpcs_1_1_cpp_string_t.html#a9eed3f6c5e09f98f3d5916cc5b3a4311":[2,0,0,0,44], +"classpcs_1_1_cpp_string_t.html#a9f43f20029596abc1362d1242e68e5db":[0,0,0,0,59], "classpcs_1_1_cpp_string_t.html#a9f43f20029596abc1362d1242e68e5db":[1,0,0,0,59], -"classpcs_1_1_cpp_string_t.html#a9f43f20029596abc1362d1242e68e5db":[2,0,0,0,59], +"classpcs_1_1_cpp_string_t.html#aa3523b858357399995e4fb9ec796c96c":[0,0,0,0,40], "classpcs_1_1_cpp_string_t.html#aa3523b858357399995e4fb9ec796c96c":[1,0,0,0,40], -"classpcs_1_1_cpp_string_t.html#aa3523b858357399995e4fb9ec796c96c":[2,0,0,0,40], +"classpcs_1_1_cpp_string_t.html#ab0ace502f0b3026fefd2942a1e8a0456":[0,0,0,0,72], "classpcs_1_1_cpp_string_t.html#ab0ace502f0b3026fefd2942a1e8a0456":[1,0,0,0,72], -"classpcs_1_1_cpp_string_t.html#ab0ace502f0b3026fefd2942a1e8a0456":[2,0,0,0,72], +"classpcs_1_1_cpp_string_t.html#ab2b293c5f1b55af52ceb75b8f7e4d42e":[0,0,0,0,87], "classpcs_1_1_cpp_string_t.html#ab2b293c5f1b55af52ceb75b8f7e4d42e":[1,0,0,0,87], -"classpcs_1_1_cpp_string_t.html#ab2b293c5f1b55af52ceb75b8f7e4d42e":[2,0,0,0,87], +"classpcs_1_1_cpp_string_t.html#ac00bb6f7d74bfdde0d4cc247e78ab20e":[0,0,0,0,58], "classpcs_1_1_cpp_string_t.html#ac00bb6f7d74bfdde0d4cc247e78ab20e":[1,0,0,0,58], -"classpcs_1_1_cpp_string_t.html#ac00bb6f7d74bfdde0d4cc247e78ab20e":[2,0,0,0,58], +"classpcs_1_1_cpp_string_t.html#ac1ad3018d38f291e6debad8d2de92be1":[0,0,0,0,47], "classpcs_1_1_cpp_string_t.html#ac1ad3018d38f291e6debad8d2de92be1":[1,0,0,0,47], -"classpcs_1_1_cpp_string_t.html#ac1ad3018d38f291e6debad8d2de92be1":[2,0,0,0,47], +"classpcs_1_1_cpp_string_t.html#ac1b427d4cc4c2aed8252b3526b63f1b1":[0,0,0,0,43], "classpcs_1_1_cpp_string_t.html#ac1b427d4cc4c2aed8252b3526b63f1b1":[1,0,0,0,43], -"classpcs_1_1_cpp_string_t.html#ac1b427d4cc4c2aed8252b3526b63f1b1":[2,0,0,0,43], +"classpcs_1_1_cpp_string_t.html#ac3079cbecbdf4151e66f602f39ece836":[0,0,0,0,66], "classpcs_1_1_cpp_string_t.html#ac3079cbecbdf4151e66f602f39ece836":[1,0,0,0,66], -"classpcs_1_1_cpp_string_t.html#ac3079cbecbdf4151e66f602f39ece836":[2,0,0,0,66], +"classpcs_1_1_cpp_string_t.html#ac4c9351bb52eb9a62fa7fb2e2d5f054d":[0,0,0,0,19], "classpcs_1_1_cpp_string_t.html#ac4c9351bb52eb9a62fa7fb2e2d5f054d":[1,0,0,0,19], -"classpcs_1_1_cpp_string_t.html#ac4c9351bb52eb9a62fa7fb2e2d5f054d":[2,0,0,0,19], +"classpcs_1_1_cpp_string_t.html#ac5f88b0fc1f33cda23c30cb1f3bc560f":[0,0,0,0,54], "classpcs_1_1_cpp_string_t.html#ac5f88b0fc1f33cda23c30cb1f3bc560f":[1,0,0,0,54], -"classpcs_1_1_cpp_string_t.html#ac5f88b0fc1f33cda23c30cb1f3bc560f":[2,0,0,0,54], +"classpcs_1_1_cpp_string_t.html#acf4d923cfed55cfd90cf12651ce0ac3d":[0,0,0,0,77], "classpcs_1_1_cpp_string_t.html#acf4d923cfed55cfd90cf12651ce0ac3d":[1,0,0,0,77], -"classpcs_1_1_cpp_string_t.html#acf4d923cfed55cfd90cf12651ce0ac3d":[2,0,0,0,77], +"classpcs_1_1_cpp_string_t.html#ad2cfcc7bd22736ebd9f91f04e6a42f8c":[0,0,0,0,82], "classpcs_1_1_cpp_string_t.html#ad2cfcc7bd22736ebd9f91f04e6a42f8c":[1,0,0,0,82], -"classpcs_1_1_cpp_string_t.html#ad2cfcc7bd22736ebd9f91f04e6a42f8c":[2,0,0,0,82], +"classpcs_1_1_cpp_string_t.html#ad3d2b94f37325096205e399b95e9fc5d":[0,0,0,0,95], "classpcs_1_1_cpp_string_t.html#ad3d2b94f37325096205e399b95e9fc5d":[1,0,0,0,95], -"classpcs_1_1_cpp_string_t.html#ad3d2b94f37325096205e399b95e9fc5d":[2,0,0,0,95], +"classpcs_1_1_cpp_string_t.html#ad4f39683db649aa8a65907268c499f02":[0,0,0,0,57], "classpcs_1_1_cpp_string_t.html#ad4f39683db649aa8a65907268c499f02":[1,0,0,0,57], -"classpcs_1_1_cpp_string_t.html#ad4f39683db649aa8a65907268c499f02":[2,0,0,0,57], +"classpcs_1_1_cpp_string_t.html#ad5c765eaa85cb4a3e7a914d55a6a5175":[0,0,0,0,46], "classpcs_1_1_cpp_string_t.html#ad5c765eaa85cb4a3e7a914d55a6a5175":[1,0,0,0,46], -"classpcs_1_1_cpp_string_t.html#ad5c765eaa85cb4a3e7a914d55a6a5175":[2,0,0,0,46], +"classpcs_1_1_cpp_string_t.html#ad6a8dc124ab8b7cab1cb328240763ed0":[0,0,0,0,56], "classpcs_1_1_cpp_string_t.html#ad6a8dc124ab8b7cab1cb328240763ed0":[1,0,0,0,56], -"classpcs_1_1_cpp_string_t.html#ad6a8dc124ab8b7cab1cb328240763ed0":[2,0,0,0,56], +"classpcs_1_1_cpp_string_t.html#ad72611f339c2b9027a72fa26f25748c3":[0,0,0,0,38], "classpcs_1_1_cpp_string_t.html#ad72611f339c2b9027a72fa26f25748c3":[1,0,0,0,38], -"classpcs_1_1_cpp_string_t.html#ad72611f339c2b9027a72fa26f25748c3":[2,0,0,0,38], +"classpcs_1_1_cpp_string_t.html#ae0865e2c7f8a4871804bf71c1c982dc6":[0,0,0,0,85], "classpcs_1_1_cpp_string_t.html#ae0865e2c7f8a4871804bf71c1c982dc6":[1,0,0,0,85], -"classpcs_1_1_cpp_string_t.html#ae0865e2c7f8a4871804bf71c1c982dc6":[2,0,0,0,85], +"classpcs_1_1_cpp_string_t.html#ae2f755ae7903586a2086b7b7f943d96e":[0,0,0,0,81], "classpcs_1_1_cpp_string_t.html#ae2f755ae7903586a2086b7b7f943d96e":[1,0,0,0,81], -"classpcs_1_1_cpp_string_t.html#ae2f755ae7903586a2086b7b7f943d96e":[2,0,0,0,81], +"classpcs_1_1_cpp_string_t.html#ae4ff448bb92e6499c0a76f7d8e11126c":[0,0,0,0,33], "classpcs_1_1_cpp_string_t.html#ae4ff448bb92e6499c0a76f7d8e11126c":[1,0,0,0,33], -"classpcs_1_1_cpp_string_t.html#ae4ff448bb92e6499c0a76f7d8e11126c":[2,0,0,0,33], +"classpcs_1_1_cpp_string_t.html#aed96c44c384cab45342122cd7e2f02eb":[0,0,0,0,45], "classpcs_1_1_cpp_string_t.html#aed96c44c384cab45342122cd7e2f02eb":[1,0,0,0,45], -"classpcs_1_1_cpp_string_t.html#aed96c44c384cab45342122cd7e2f02eb":[2,0,0,0,45], +"classpcs_1_1_cpp_string_t.html#aee6e48d5b478d5bab239f54523d23c15":[0,0,0,0,48], "classpcs_1_1_cpp_string_t.html#aee6e48d5b478d5bab239f54523d23c15":[1,0,0,0,48], -"classpcs_1_1_cpp_string_t.html#aee6e48d5b478d5bab239f54523d23c15":[2,0,0,0,48], +"classpcs_1_1_cpp_string_t.html#aee94d4b52483021051b168e776b18569":[0,0,0,0,25], "classpcs_1_1_cpp_string_t.html#aee94d4b52483021051b168e776b18569":[1,0,0,0,25], -"classpcs_1_1_cpp_string_t.html#aee94d4b52483021051b168e776b18569":[2,0,0,0,25], +"classpcs_1_1_cpp_string_t.html#af18311d8608e71627bc85f96581e4dd3":[0,0,0,0,3], "classpcs_1_1_cpp_string_t.html#af18311d8608e71627bc85f96581e4dd3":[1,0,0,0,3], -"classpcs_1_1_cpp_string_t.html#af18311d8608e71627bc85f96581e4dd3":[2,0,0,0,3], +"classpcs_1_1_cpp_string_t.html#af2784cbe9655bb8e23fe90375d79e69c":[0,0,0,0,39], "classpcs_1_1_cpp_string_t.html#af2784cbe9655bb8e23fe90375d79e69c":[1,0,0,0,39], -"classpcs_1_1_cpp_string_t.html#af2784cbe9655bb8e23fe90375d79e69c":[2,0,0,0,39], +"classpcs_1_1_cpp_string_t.html#af363308ba741b267641e1aa35669d603":[0,0,0,0,60], "classpcs_1_1_cpp_string_t.html#af363308ba741b267641e1aa35669d603":[1,0,0,0,60], -"classpcs_1_1_cpp_string_t.html#af363308ba741b267641e1aa35669d603":[2,0,0,0,60], +"classpcs_1_1_cpp_string_t.html#afc08a4e91b93710838c8f0d6234e057e":[0,0,0,0,67], "classpcs_1_1_cpp_string_t.html#afc08a4e91b93710838c8f0d6234e057e":[1,0,0,0,67], -"classpcs_1_1_cpp_string_t.html#afc08a4e91b93710838c8f0d6234e057e":[2,0,0,0,67], +"classpcs_1_1_cpp_string_t_1_1_not_found_exception.html":[0,0,0,0,0], "classpcs_1_1_cpp_string_t_1_1_not_found_exception.html":[1,0,0,0,0], -"classpcs_1_1_cpp_string_t_1_1_not_found_exception.html":[2,0,0,0,0], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html":[0,0,0,0,1], "classpcs_1_1_cpp_string_t_1_1_trans_table.html":[1,0,0,0,1], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html":[2,0,0,0,1], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1c10bb78e74942f88247cde65a03d557":[0,0,0,0,1,8], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1c10bb78e74942f88247cde65a03d557":[1,0,0,0,1,8], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1c10bb78e74942f88247cde65a03d557":[2,0,0,0,1,8], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1fea49a165ebb7cda36c1bfdcbe95ee0":[0,0,0,0,1,0], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1fea49a165ebb7cda36c1bfdcbe95ee0":[1,0,0,0,1,0], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1fea49a165ebb7cda36c1bfdcbe95ee0":[2,0,0,0,1,0], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a21791e46266edb8eea13876559b352a2":[0,0,0,0,1,9], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a21791e46266edb8eea13876559b352a2":[1,0,0,0,1,9], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a21791e46266edb8eea13876559b352a2":[2,0,0,0,1,9], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a3efc5aab74f3a0594a9e88562d57867d":[0,0,0,0,1,17], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a3efc5aab74f3a0594a9e88562d57867d":[1,0,0,0,1,17], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a3efc5aab74f3a0594a9e88562d57867d":[2,0,0,0,1,17], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a4f1dd7fb1ede54aa662c808eb84cda41":[0,0,0,0,1,15], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a4f1dd7fb1ede54aa662c808eb84cda41":[1,0,0,0,1,15], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a4f1dd7fb1ede54aa662c808eb84cda41":[2,0,0,0,1,15], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a551b96c6c0ab2bf9183de0bfcc6770a2":[0,0,0,0,1,7], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a551b96c6c0ab2bf9183de0bfcc6770a2":[1,0,0,0,1,7], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a551b96c6c0ab2bf9183de0bfcc6770a2":[2,0,0,0,1,7], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a5efa34c2e8b016458388693a7ab8f590":[0,0,0,0,1,1], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a5efa34c2e8b016458388693a7ab8f590":[1,0,0,0,1,1], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a5efa34c2e8b016458388693a7ab8f590":[2,0,0,0,1,1], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a69a3ab2775d7e6537528a3eba3c4134a":[0,0,0,0,1,11], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a69a3ab2775d7e6537528a3eba3c4134a":[1,0,0,0,1,11], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a69a3ab2775d7e6537528a3eba3c4134a":[2,0,0,0,1,11], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a78d8ac95a740d405c761c73166c9b787":[0,0,0,0,1,6], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a78d8ac95a740d405c761c73166c9b787":[1,0,0,0,1,6], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a78d8ac95a740d405c761c73166c9b787":[2,0,0,0,1,6], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a7da38829b171a7a9147b43086e067454":[0,0,0,0,1,10], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a7da38829b171a7a9147b43086e067454":[1,0,0,0,1,10], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a7da38829b171a7a9147b43086e067454":[2,0,0,0,1,10], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a90ac2a729fc715870e7f32ea9c6536f9":[0,0,0,0,1,18], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a90ac2a729fc715870e7f32ea9c6536f9":[1,0,0,0,1,18], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a90ac2a729fc715870e7f32ea9c6536f9":[2,0,0,0,1,18], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a9d7651fe71544575150ebc08022cb885":[0,0,0,0,1,5], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#a9d7651fe71544575150ebc08022cb885":[1,0,0,0,1,5], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#a9d7651fe71544575150ebc08022cb885":[2,0,0,0,1,5], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa9182c3323cdba7f6dd30bfa56ebb8fe":[0,0,0,0,1,12], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa9182c3323cdba7f6dd30bfa56ebb8fe":[1,0,0,0,1,12], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa9182c3323cdba7f6dd30bfa56ebb8fe":[2,0,0,0,1,12], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa99c6a9fafac1361cd8a0fc4578fa084":[0,0,0,0,1,2], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa99c6a9fafac1361cd8a0fc4578fa084":[1,0,0,0,1,2], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa99c6a9fafac1361cd8a0fc4578fa084":[2,0,0,0,1,2], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#aae6cedd7e9c8409e76787c910476813e":[0,0,0,0,1,3], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#aae6cedd7e9c8409e76787c910476813e":[1,0,0,0,1,3], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#aae6cedd7e9c8409e76787c910476813e":[2,0,0,0,1,3], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#ab7a09175127849e20aa8aa5b999b4413":[0,0,0,0,1,14], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#ab7a09175127849e20aa8aa5b999b4413":[1,0,0,0,1,14], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#ab7a09175127849e20aa8aa5b999b4413":[2,0,0,0,1,14], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#abbbcd9cf0c3ac0a364864f734363dd4c":[0,0,0,0,1,13], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#abbbcd9cf0c3ac0a364864f734363dd4c":[1,0,0,0,1,13], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#abbbcd9cf0c3ac0a364864f734363dd4c":[2,0,0,0,1,13], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#abf0efc2e493b5c0347327b7c1f175ed8":[0,0,0,0,1,4], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#abf0efc2e493b5c0347327b7c1f175ed8":[1,0,0,0,1,4], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#abf0efc2e493b5c0347327b7c1f175ed8":[2,0,0,0,1,4], +"classpcs_1_1_cpp_string_t_1_1_trans_table.html#addccd32880c403ee20a6a8423d8d3f8b":[0,0,0,0,1,16], "classpcs_1_1_cpp_string_t_1_1_trans_table.html#addccd32880c403ee20a6a8423d8d3f8b":[1,0,0,0,1,16], -"classpcs_1_1_cpp_string_t_1_1_trans_table.html#addccd32880c403ee20a6a8423d8d3f8b":[2,0,0,0,1,16], +"classpcs_1_1_slice.html":[0,0,0,1], "classpcs_1_1_slice.html":[1,0,0,1], -"classpcs_1_1_slice.html":[2,0,0,1], +"classpcs_1_1_slice.html#a0fed0ac66885187eb64d1982e0461916":[0,0,0,1,9], "classpcs_1_1_slice.html#a0fed0ac66885187eb64d1982e0461916":[1,0,0,1,9], -"classpcs_1_1_slice.html#a0fed0ac66885187eb64d1982e0461916":[2,0,0,1,9], +"classpcs_1_1_slice.html#a5280a9d6974217c94de5d9027e10d4e1":[0,0,0,1,7], "classpcs_1_1_slice.html#a5280a9d6974217c94de5d9027e10d4e1":[1,0,0,1,7], -"classpcs_1_1_slice.html#a5280a9d6974217c94de5d9027e10d4e1":[2,0,0,1,7], +"classpcs_1_1_slice.html#a55f046a5343a6ea1bbff8686d2e72d78":[0,0,0,1,8], "classpcs_1_1_slice.html#a55f046a5343a6ea1bbff8686d2e72d78":[1,0,0,1,8], -"classpcs_1_1_slice.html#a55f046a5343a6ea1bbff8686d2e72d78":[2,0,0,1,8], +"classpcs_1_1_slice.html#a79edb1eb4e6bce136f730d82f7afeaff":[0,0,0,1,5], "classpcs_1_1_slice.html#a79edb1eb4e6bce136f730d82f7afeaff":[1,0,0,1,5], -"classpcs_1_1_slice.html#a79edb1eb4e6bce136f730d82f7afeaff":[2,0,0,1,5], +"classpcs_1_1_slice.html#aa3e4bcf5cfd5917cc10e0641030984c2":[0,0,0,1,6], "classpcs_1_1_slice.html#aa3e4bcf5cfd5917cc10e0641030984c2":[1,0,0,1,6], -"classpcs_1_1_slice.html#aa3e4bcf5cfd5917cc10e0641030984c2":[2,0,0,1,6], +"classpcs_1_1_slice.html#ab51c3b03351e495729545f2fdaebb888":[0,0,0,1,0], "classpcs_1_1_slice.html#ab51c3b03351e495729545f2fdaebb888":[1,0,0,1,0], -"classpcs_1_1_slice.html#ab51c3b03351e495729545f2fdaebb888":[2,0,0,1,0], -"classpcs_1_1_slice.html#ab55cf50ae2018337b942e7b9e08e3e6d":[1,0,0,1,2], -"classpcs_1_1_slice.html#ab55cf50ae2018337b942e7b9e08e3e6d":[2,0,0,1,2] +"classpcs_1_1_slice.html#ab55cf50ae2018337b942e7b9e08e3e6d":[0,0,0,1,2], +"classpcs_1_1_slice.html#ab55cf50ae2018337b942e7b9e08e3e6d":[1,0,0,1,2] }; diff --git a/documentation/navtreeindex1.js b/documentation/navtreeindex1.js new file mode 100644 index 0000000..b1c2e12 --- /dev/null +++ b/documentation/navtreeindex1.js @@ -0,0 +1,96 @@ +var NAVTREEINDEX1 = +{ +"classpcs_1_1_slice.html#abdb6694913ed37cf4efc5d85e990c7b5":[0,0,0,1,1], +"classpcs_1_1_slice.html#abdb6694913ed37cf4efc5d85e990c7b5":[1,0,0,1,1], +"classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c":[0,0,0,1,3], +"classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c":[1,0,0,1,3], +"classpcs_1_1_slice.html#afa6b7dc85e796da20dd5933d49400996":[0,0,0,1,4], +"classpcs_1_1_slice.html#afa6b7dc85e796da20dd5933d49400996":[1,0,0,1,4], +"functions.html":[1,3,0], +"functions_func.html":[1,3,1], +"hierarchy.html":[1,2], +"index.html":[], +"namespacemembers.html":[0,1,0], +"namespacemembers_func.html":[0,1,1], +"namespacemembers_type.html":[0,1,2], +"namespacepcs.html":[0,0,0], +"namespacepcs.html#a01c6093b1a8ef52114f799635ff930d5":[0,0,0,19], +"namespacepcs.html#a02d340dd9c510eda0fbfed07a08d0792":[0,0,0,31], +"namespacepcs.html#a069625790af3ecf05a424c2c53eabfc0":[0,0,0,12], +"namespacepcs.html#a08d21c458d61442667df24212920d0d9":[0,0,0,8], +"namespacepcs.html#a1cd19ec212e3ada992a8effb8d5d872d":[0,0,0,29], +"namespacepcs.html#a242e3c28e3d47d19d70ab70d83e74d35":[0,0,0,26], +"namespacepcs.html#a28f77929d599a862403a4471f6b73fc3":[0,0,0,15], +"namespacepcs.html#a29893984c95e53a6efe01f74c2dcc03a":[0,0,0,23], +"namespacepcs.html#a30ed0cd7942d081369f78a49a029d8b1":[0,0,0,30], +"namespacepcs.html#a363e2bac9c403a623c5a410f7113edd3":[0,0,0,33], +"namespacepcs.html#a40bc3d234e3c737f34d267151ca62014":[0,0,0,10], +"namespacepcs.html#a4c4164fedd9cb659873a980fa855f4a2":[0,0,0,44], +"namespacepcs.html#a51cd6883557ab31a1e0c8e7b5ab27351":[0,0,0,28], +"namespacepcs.html#a52b12f8beb4ab7d8b819ca24180e08d1":[0,0,0,17], +"namespacepcs.html#a57a765c6eb624107a2176a56cf2220a7":[0,0,0,36], +"namespacepcs.html#a607c82cc94f2b6473d8391334eed8c14":[0,0,0,46], +"namespacepcs.html#a60a2017b25d3d06b83e72f5ed5a93d09":[0,0,0,16], +"namespacepcs.html#a714cfa835ef4db5180309829ee8e27a9":[0,0,0,35], +"namespacepcs.html#a79a822cea8e301fd51d2ed51dff57286":[0,0,0,9], +"namespacepcs.html#a8cb1cd0a1e39d92893eb7d22145f5d65":[0,0,0,37], +"namespacepcs.html#a965f285db4253ce86ed59fccc2e8be61":[0,0,0,43], +"namespacepcs.html#a9f0ba4e85fc273fad1a8b489f3be7fa8":[0,0,0,14], +"namespacepcs.html#aa36d34c2227cde5856e8d61fa6e4af58":[0,0,0,32], +"namespacepcs.html#aaf8dcc64819cbf8631fc63e0dd522811":[0,0,0,48], +"namespacepcs.html#ab097a99126055ab4c843eb6efb573bb1":[0,0,0,45], +"namespacepcs.html#ab5077443809e9e4eb7bfa463728f398a":[0,0,0,39], +"namespacepcs.html#ab823c7be920affd05f96a6ad8b99accf":[0,0,0,47], +"namespacepcs.html#abfda7874fe5b1f72c1c5a9a04d5c7e42":[0,0,0,21], +"namespacepcs.html#ac25d471fa1d838401335776ad4b6ead1":[0,0,0,38], +"namespacepcs.html#ac6e0b881e35c04e9b5bbe6e8b17ee1a7":[0,0,0,42], +"namespacepcs.html#ac7822fd0c570f69d597936a24c38ba2a":[0,0,0,13], +"namespacepcs.html#acab7e7bb1ffd6e4ea1a8300b05478647":[0,0,0,27], +"namespacepcs.html#acb7395de8ef88696d0c8c9772e172118":[0,0,0,41], +"namespacepcs.html#ad1d1b13c16ce784055e93af9fa34fb5c":[0,0,0,24], +"namespacepcs.html#ade5b26313fc856bb882109d6945629b8":[0,0,0,11], +"namespacepcs.html#aedd570e9ffa0572d56fce5085594bdbb":[0,0,0,22], +"namespacepcs.html#aef0240331a343bb1ad13eb613ca93fa4":[0,0,0,20], +"namespacepcs.html#af089ceadbeaab27e12ad7f7edaaec72a":[0,0,0,34], +"namespacepcs.html#af1b60c1081e8bc3b4cd91fbe240e9b87":[0,0,0,25], +"namespacepcs.html#af7c58514e3378a219904f22eb22e9072":[0,0,0,18], +"namespacepcs.html#afb8dd890fe893aba3264ac7df4fe7124":[0,0,0,40], +"namespaces.html":[0,0], +"pages.html":[], +"structpcs_1_1_start_slice.html":[0,0,0,2], +"structpcs_1_1_start_slice.html":[1,0,0,2], +"structpcs_1_1_start_slice.html#a6f792a61218b7598f8f6bb37dcdae56e":[0,0,0,2,1], +"structpcs_1_1_start_slice.html#a6f792a61218b7598f8f6bb37dcdae56e":[1,0,0,2,1], +"structpcs_1_1_start_slice.html#ae435a090e0d93fe221cab4822e352886":[0,0,0,2,0], +"structpcs_1_1_start_slice.html#ae435a090e0d93fe221cab4822e352886":[1,0,0,2,0], +"structpcs_1_1_start_step_slice.html":[0,0,0,3], +"structpcs_1_1_start_step_slice.html":[1,0,0,3], +"structpcs_1_1_start_step_slice.html#a438eef8b248cc00ed48afda08aff6d4c":[0,0,0,3,0], +"structpcs_1_1_start_step_slice.html#a438eef8b248cc00ed48afda08aff6d4c":[1,0,0,3,0], +"structpcs_1_1_start_step_slice.html#adc0aae8a3849379742e23c4f3a3197a9":[0,0,0,3,1], +"structpcs_1_1_start_step_slice.html#adc0aae8a3849379742e23c4f3a3197a9":[1,0,0,3,1], +"structpcs_1_1_start_stop_slice.html":[0,0,0,4], +"structpcs_1_1_start_stop_slice.html":[1,0,0,4], +"structpcs_1_1_start_stop_slice.html#a7c8ad9cb9d63fb9d56b3dbc9647297b4":[0,0,0,4,0], +"structpcs_1_1_start_stop_slice.html#a7c8ad9cb9d63fb9d56b3dbc9647297b4":[1,0,0,4,0], +"structpcs_1_1_start_stop_slice.html#a95df964c79860a475a63da3e56301ea7":[0,0,0,4,1], +"structpcs_1_1_start_stop_slice.html#a95df964c79860a475a63da3e56301ea7":[1,0,0,4,1], +"structpcs_1_1_step_slice.html":[0,0,0,5], +"structpcs_1_1_step_slice.html":[1,0,0,5], +"structpcs_1_1_step_slice.html#a93892e4d8f153a06a65e0cd13ebfa949":[0,0,0,5,1], +"structpcs_1_1_step_slice.html#a93892e4d8f153a06a65e0cd13ebfa949":[1,0,0,5,1], +"structpcs_1_1_step_slice.html#ad24accb58329f71457fbaf00fbbbf874":[0,0,0,5,0], +"structpcs_1_1_step_slice.html#ad24accb58329f71457fbaf00fbbbf874":[1,0,0,5,0], +"structpcs_1_1_stop_slice.html":[0,0,0,6], +"structpcs_1_1_stop_slice.html":[1,0,0,6], +"structpcs_1_1_stop_slice.html#a6e7e761a846ec00b1f24be9f83830f25":[0,0,0,6,1], +"structpcs_1_1_stop_slice.html#a6e7e761a846ec00b1f24be9f83830f25":[1,0,0,6,1], +"structpcs_1_1_stop_slice.html#a9d59c11b1bc398b71abc59b4071da379":[0,0,0,6,0], +"structpcs_1_1_stop_slice.html#a9d59c11b1bc398b71abc59b4071da379":[1,0,0,6,0], +"structpcs_1_1_stop_step_slice.html":[0,0,0,7], +"structpcs_1_1_stop_step_slice.html":[1,0,0,7], +"structpcs_1_1_stop_step_slice.html#a86288ad6b535b8b4d522e8173511c639":[0,0,0,7,0], +"structpcs_1_1_stop_step_slice.html#a86288ad6b535b8b4d522e8173511c639":[1,0,0,7,0], +"structpcs_1_1_stop_step_slice.html#aa62d3d31f646766a6ea2ef3cd9f91491":[0,0,0,7,1], +"structpcs_1_1_stop_step_slice.html#aa62d3d31f646766a6ea2ef3cd9f91491":[1,0,0,7,1] +}; diff --git a/cpp-strings/html/search/all_4.js b/documentation/search/all_0.js similarity index 100% rename from cpp-strings/html/search/all_4.js rename to documentation/search/all_0.js diff --git a/documentation/search/all_1.js b/documentation/search/all_1.js new file mode 100644 index 0000000..4a304af --- /dev/null +++ b/documentation/search/all_1.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['capitalize_0',['capitalize',['../classpcs_1_1_cpp_string_t.html#a48a00cca031b9c29d1912508e120a5f6',1,'pcs::CppStringT']]], + ['center_1',['center',['../classpcs_1_1_cpp_string_t.html#af18311d8608e71627bc85f96581e4dd3',1,'pcs::CppStringT']]], + ['contains_2',['contains',['../classpcs_1_1_cpp_string_t.html#a0674e29327353aabf83d0e207fed31ed',1,'pcs::CppStringT']]], + ['contains_5fn_3',['contains_n',['../classpcs_1_1_cpp_string_t.html#a031b05f290f589b2df52bb84252c27c7',1,'pcs::CppStringT']]], + ['count_4',['count',['../classpcs_1_1_cpp_string_t.html#a7beda74b4d5092845a970d51d01fe4bf',1,'pcs::CppStringT']]], + ['count_5fn_5',['count_n',['../classpcs_1_1_cpp_string_t.html#a76f97d56e1713182d5e85d58cd445d10',1,'pcs::CppStringT::count_n(const CppStringT &sub, const size_type start, const size_type length) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a59839e3b5a186c2554224dbf4528c1b4',1,'pcs::CppStringT::count_n(const CppStringT &sub, const size_type length) const noexcept']]], + ['cppstring_6',['CppString',['../namespacepcs.html#a08d21c458d61442667df24212920d0d9',1,'pcs']]], + ['cppstringt_7',['CppStringT',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], + ['cppstringt_3c_20char_20_3e_8',['CppStringT< char >',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], + ['cppstringt_3c_20wchar_5ft_20_3e_9',['CppStringT< wchar_t >',['../classpcs_1_1_cpp_string_t.html',1,'pcs']]], + ['cppwstring_10',['CppWString',['../namespacepcs.html#a79a822cea8e301fd51d2ed51dff57286',1,'pcs']]] +]; diff --git a/cpp-strings/html/search/all_17.js b/documentation/search/all_10.js similarity index 100% rename from cpp-strings/html/search/all_17.js rename to documentation/search/all_10.js diff --git a/cpp-strings/html/search/all_11.js b/documentation/search/all_11.js similarity index 86% rename from cpp-strings/html/search/all_11.js rename to documentation/search/all_11.js index 9896b90..30c6fb0 100644 --- a/cpp-strings/html/search/all_11.js +++ b/documentation/search/all_11.js @@ -1,8 +1,8 @@ var searchData= [ - ['release_201_200_0',['Missing parts in Release 1.0',['../index.html#autotoc_md7',1,'']]], - ['release_201_200_201_200_200_20229_202025_2007_1',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['release_20release_201_200_201_200_200_20229_202025_2007_2',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], + ['release_201_200_0',['Missing parts in Release 1.0',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md6',1,'']]], + ['release_201_200_201_200_202_20232_202025_2007_1',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], + ['release_20release_201_200_201_200_202_20232_202025_2007_2',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], ['removeprefix_3',['removeprefix',['../classpcs_1_1_cpp_string_t.html#a058704b7f4538ec9e1798c5348d37c7a',1,'pcs::CppStringT']]], ['removesuffix_4',['removesuffix',['../classpcs_1_1_cpp_string_t.html#ad6a8dc124ab8b7cab1cb328240763ed0',1,'pcs::CppStringT']]], ['replace_5',['replace',['../classpcs_1_1_cpp_string_t.html#ad4f39683db649aa8a65907268c499f02',1,'pcs::CppStringT']]], diff --git a/cpp-strings/html/search/all_12.js b/documentation/search/all_12.js similarity index 92% rename from cpp-strings/html/search/all_12.js rename to documentation/search/all_12.js index 5928f61..1bd9f1d 100644 --- a/cpp-strings/html/search/all_12.js +++ b/documentation/search/all_12.js @@ -14,8 +14,8 @@ var searchData= ['stop_11',['stop',['../classpcs_1_1_slice.html#a0fed0ac66885187eb64d1982e0461916',1,'pcs::Slice']]], ['stopslice_12',['StopSlice',['../structpcs_1_1_stop_slice.html',1,'pcs::StopSlice< IntT >'],['../structpcs_1_1_stop_slice.html#a9d59c11b1bc398b71abc59b4071da379',1,'pcs::StopSlice::StopSlice()']]], ['stopstepslice_13',['StopStepSlice',['../structpcs_1_1_stop_step_slice.html',1,'pcs::StopStepSlice< IntT >'],['../structpcs_1_1_stop_step_slice.html#a86288ad6b535b8b4d522e8173511c639',1,'pcs::StopStepSlice::StopStepSlice()']]], - ['strings_14',['strings',['../index.html',1,'Library cpp-strings'],['../index.html#autotoc_md1',1,'What if c++ strings where as easy to use as Python strings?']]], - ['strings_20where_20as_20easy_20to_20use_20as_20python_20strings_15',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['strings_14',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]], + ['strings_20were_20as_20easy_20to_20use_20as_20python_20strings_15',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]], ['strip_16',['strip',['../classpcs_1_1_cpp_string_t.html#a02919129cdf158e75eae1e9815a071bf',1,'pcs::CppStringT::strip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a12bc043347f555b4701e0c70d972058d',1,'pcs::CppStringT::strip() const noexcept']]], ['substr_17',['substr',['../classpcs_1_1_cpp_string_t.html#a9debc70420a3fbc7722e3111aeccd819',1,'pcs::CppStringT']]], ['swap_5fcase_18',['swap_case',['../namespacepcs.html#ac6e0b881e35c04e9b5bbe6e8b17ee1a7',1,'pcs']]], diff --git a/cpp-strings/html/search/all_13.js b/documentation/search/all_13.js similarity index 95% rename from cpp-strings/html/search/all_13.js rename to documentation/search/all_13.js index 46d2dc7..43e40ba 100644 --- a/cpp-strings/html/search/all_13.js +++ b/documentation/search/all_13.js @@ -1,7 +1,7 @@ var searchData= [ ['title_0',['title',['../classpcs_1_1_cpp_string_t.html#a179634aafb049e8604ca78f813684a28',1,'pcs::CppStringT']]], - ['to_20use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], + ['to_20use_20as_20python_20strings_1',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]], ['to_5flower_2',['to_lower',['../namespacepcs.html#a965f285db4253ce86ed59fccc2e8be61',1,'pcs']]], ['to_5flower_3c_20char_20_3e_3',['to_lower< char >',['../namespacepcs.html#a4c4164fedd9cb659873a980fa855f4a2',1,'pcs']]], ['to_5flower_3c_20wchar_5ft_20_3e_4',['to_lower< wchar_t >',['../namespacepcs.html#ab097a99126055ab4c843eb6efb573bb1',1,'pcs']]], diff --git a/documentation/search/all_14.js b/documentation/search/all_14.js new file mode 100644 index 0000000..c8b2e39 --- /dev/null +++ b/documentation/search/all_14.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['upper_0',['upper',['../classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120',1,'pcs::CppStringT::upper() noexcept'],['../classpcs_1_1_cpp_string_t.html#af5ff8cdba1d90516915e20f93567a9a9',1,'pcs::CppStringT::upper(const value_type ch) noexcept']]], + ['use_20as_20python_20strings_1',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/documentation/search/all_15.js b/documentation/search/all_15.js new file mode 100644 index 0000000..78dfefc --- /dev/null +++ b/documentation/search/all_15.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['were_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]], + ['what_20if_20c_20strings_20were_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/cpp-strings/html/search/all_16.js b/documentation/search/all_16.js similarity index 100% rename from cpp-strings/html/search/all_16.js rename to documentation/search/all_16.js diff --git a/cpp-strings/html/search/functions_f.js b/documentation/search/all_17.js similarity index 100% rename from cpp-strings/html/search/functions_f.js rename to documentation/search/all_17.js diff --git a/cpp-strings/html/search/functions_2.js b/documentation/search/all_2.js similarity index 100% rename from cpp-strings/html/search/functions_2.js rename to documentation/search/all_2.js diff --git a/cpp-strings/html/search/all_8.js b/documentation/search/all_3.js similarity index 100% rename from cpp-strings/html/search/all_8.js rename to documentation/search/all_3.js diff --git a/cpp-strings/html/search/all_9.js b/documentation/search/all_4.js similarity index 100% rename from cpp-strings/html/search/all_9.js rename to documentation/search/all_4.js diff --git a/cpp-strings/html/search/functions_5.js b/documentation/search/all_5.js similarity index 100% rename from cpp-strings/html/search/functions_5.js rename to documentation/search/all_5.js diff --git a/cpp-strings/html/search/all_b.js b/documentation/search/all_6.js similarity index 100% rename from cpp-strings/html/search/all_b.js rename to documentation/search/all_6.js diff --git a/cpp-strings/html/search/functions_7.js b/documentation/search/all_7.js similarity index 100% rename from cpp-strings/html/search/functions_7.js rename to documentation/search/all_7.js diff --git a/cpp-strings/html/search/all_e.js b/documentation/search/all_8.js similarity index 100% rename from cpp-strings/html/search/all_e.js rename to documentation/search/all_8.js diff --git a/cpp-strings/html/search/all_f.js b/documentation/search/all_9.js similarity index 100% rename from cpp-strings/html/search/all_f.js rename to documentation/search/all_9.js diff --git a/documentation/search/all_a.js b/documentation/search/all_a.js new file mode 100644 index 0000000..8cb9ee8 --- /dev/null +++ b/documentation/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['partition_0',['partition',['../classpcs_1_1_cpp_string_t.html#ac5f88b0fc1f33cda23c30cb1f3bc560f',1,'pcs::CppStringT']]], + ['pcs_1',['pcs',['../namespacepcs.html',1,'']]] +]; diff --git a/cpp-strings/html/search/functions_a.js b/documentation/search/all_b.js similarity index 100% rename from cpp-strings/html/search/functions_a.js rename to documentation/search/all_b.js diff --git a/documentation/search/all_c.js b/documentation/search/all_c.js new file mode 100644 index 0000000..338902b --- /dev/null +++ b/documentation/search/all_c.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['slice_0',['Slice',['../classpcs_1_1_slice.html',1,'pcs::Slice< IntT >'],['../classpcs_1_1_slice.html#ab51c3b03351e495729545f2fdaebb888',1,'pcs::Slice::Slice()']]], + ['split_1',['split',['../classpcs_1_1_cpp_string_t.html#a7ca47096b03baa0091c3b0349d210931',1,'pcs::CppStringT::split() noexcept'],['../classpcs_1_1_cpp_string_t.html#acf4d923cfed55cfd90cf12651ce0ac3d',1,'pcs::CppStringT::split(const CppStringT &sep) noexcept'],['../classpcs_1_1_cpp_string_t.html#a8fa2afe84d7fc26f96bbd55f4266df2a',1,'pcs::CppStringT::split(const size_type maxsplit) noexcept'],['../classpcs_1_1_cpp_string_t.html#a55a3fa32de834f644ac28d7c2495fa77',1,'pcs::CppStringT::split(const CppStringT &sep, const size_type maxsplit) noexcept']]], + ['splitlines_2',['splitlines',['../classpcs_1_1_cpp_string_t.html#a0bd53df14569c307b5ca50a2e1e62960',1,'pcs::CppStringT']]], + ['start_3',['start',['../classpcs_1_1_slice.html#a5280a9d6974217c94de5d9027e10d4e1',1,'pcs::Slice']]], + ['startslice_4',['StartSlice',['../structpcs_1_1_start_slice.html',1,'pcs::StartSlice< IntT >'],['../structpcs_1_1_start_slice.html#ae435a090e0d93fe221cab4822e352886',1,'pcs::StartSlice::StartSlice()']]], + ['startstepslice_5',['StartStepSlice',['../structpcs_1_1_start_step_slice.html',1,'pcs::StartStepSlice< IntT >'],['../structpcs_1_1_start_step_slice.html#a438eef8b248cc00ed48afda08aff6d4c',1,'pcs::StartStepSlice::StartStepSlice()']]], + ['startstopslice_6',['StartStopSlice',['../structpcs_1_1_start_stop_slice.html',1,'pcs::StartStopSlice< IntT >'],['../structpcs_1_1_start_stop_slice.html#a7c8ad9cb9d63fb9d56b3dbc9647297b4',1,'pcs::StartStopSlice::StartStopSlice()']]], + ['startswith_7',['startswith',['../classpcs_1_1_cpp_string_t.html#a5a131c385a01ccc5410d4cffa55cf700',1,'pcs::CppStringT::startswith(const CppStringT &prefix, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ad2cfcc7bd22736ebd9f91f04e6a42f8c',1,'pcs::CppStringT::startswith(const CppStringT &prefix, const size_type start) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ae2f755ae7903586a2086b7b7f943d96e',1,'pcs::CppStringT::startswith(const CppStringT &prefix) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a326eb96e19c3559a84af86ff1bf54aa4',1,'pcs::CppStringT::startswith(const std::initializer_list< CppStringT > &prefixes, const size_type start, const size_type end) const noexcept']]], + ['startswith_5fn_8',['startswith_n',['../classpcs_1_1_cpp_string_t.html#a3b7955f9c7f9452a6a025caaaf0e6d73',1,'pcs::CppStringT::startswith_n(const CppStringT &prefix, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ae0865e2c7f8a4871804bf71c1c982dc6',1,'pcs::CppStringT::startswith_n(const CppStringT &prefix, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ab2b293c5f1b55af52ceb75b8f7e4d42e',1,'pcs::CppStringT::startswith_n(const std::initializer_list< CppStringT > &prefix, const size_type start, const size_type count) const noexcept']]], + ['step_9',['step',['../classpcs_1_1_slice.html#a55f046a5343a6ea1bbff8686d2e72d78',1,'pcs::Slice']]], + ['stepslice_10',['StepSlice',['../structpcs_1_1_step_slice.html',1,'pcs::StepSlice< IntT >'],['../structpcs_1_1_step_slice.html#ad24accb58329f71457fbaf00fbbbf874',1,'pcs::StepSlice::StepSlice()']]], + ['stop_11',['stop',['../classpcs_1_1_slice.html#a0fed0ac66885187eb64d1982e0461916',1,'pcs::Slice']]], + ['stopslice_12',['StopSlice',['../structpcs_1_1_stop_slice.html',1,'pcs::StopSlice< IntT >'],['../structpcs_1_1_stop_slice.html#a9d59c11b1bc398b71abc59b4071da379',1,'pcs::StopSlice::StopSlice()']]], + ['stopstepslice_13',['StopStepSlice',['../structpcs_1_1_stop_step_slice.html',1,'pcs::StopStepSlice< IntT >'],['../structpcs_1_1_stop_step_slice.html#a86288ad6b535b8b4d522e8173511c639',1,'pcs::StopStepSlice::StopStepSlice()']]], + ['strip_14',['strip',['../classpcs_1_1_cpp_string_t.html#a02919129cdf158e75eae1e9815a071bf',1,'pcs::CppStringT::strip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a12bc043347f555b4701e0c70d972058d',1,'pcs::CppStringT::strip() const noexcept']]], + ['substr_15',['substr',['../classpcs_1_1_cpp_string_t.html#a9debc70420a3fbc7722e3111aeccd819',1,'pcs::CppStringT']]], + ['swap_5fcase_16',['swap_case',['../namespacepcs.html#ac6e0b881e35c04e9b5bbe6e8b17ee1a7',1,'pcs']]], + ['swapcase_17',['swapcase',['../classpcs_1_1_cpp_string_t.html#a6ab02b4d1c8093a5dfc089a45427f63c',1,'pcs::CppStringT']]] +]; diff --git a/documentation/search/all_d.js b/documentation/search/all_d.js new file mode 100644 index 0000000..e86110a --- /dev/null +++ b/documentation/search/all_d.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['title_0',['title',['../classpcs_1_1_cpp_string_t.html#a179634aafb049e8604ca78f813684a28',1,'pcs::CppStringT']]], + ['to_5flower_1',['to_lower',['../namespacepcs.html#a965f285db4253ce86ed59fccc2e8be61',1,'pcs']]], + ['to_5flower_3c_20char_20_3e_2',['to_lower< char >',['../namespacepcs.html#a4c4164fedd9cb659873a980fa855f4a2',1,'pcs']]], + ['to_5flower_3c_20wchar_5ft_20_3e_3',['to_lower< wchar_t >',['../namespacepcs.html#ab097a99126055ab4c843eb6efb573bb1',1,'pcs']]], + ['to_5fupper_4',['to_upper',['../namespacepcs.html#a607c82cc94f2b6473d8391334eed8c14',1,'pcs']]], + ['to_5fupper_3c_20char_20_3e_5',['to_upper< char >',['../namespacepcs.html#ab823c7be920affd05f96a6ad8b99accf',1,'pcs']]], + ['to_5fupper_3c_20wchar_5ft_20_3e_6',['to_upper< wchar_t >',['../namespacepcs.html#aaf8dcc64819cbf8631fc63e0dd522811',1,'pcs']]], + ['translate_7',['translate',['../classpcs_1_1_cpp_string_t.html#a2a8c1e78b93da9a0abe471c7a8d85090',1,'pcs::CppStringT']]], + ['transtable_8',['TransTable',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html',1,'pcs::CppStringT< CharT, TraitsT, AllocatorT >::TransTable'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1fea49a165ebb7cda36c1bfdcbe95ee0',1,'pcs::CppStringT::TransTable::TransTable(const std::map< key_type, value_type > trans_table)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a5efa34c2e8b016458388693a7ab8f590',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const CppStringT &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa99c6a9fafac1361cd8a0fc4578fa084',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const CppStringT &values, const CppStringT &not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aae6cedd7e9c8409e76787c910476813e',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#abf0efc2e493b5c0347327b7c1f175ed8',1,'pcs::CppStringT::TransTable::TransTable(const CppStringT &keys, const std::initializer_list< CppStringT > values, const CppStringT &not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a9d7651fe71544575150ebc08022cb885',1,'pcs::CppStringT::TransTable::TransTable(const CharT *keys, const CharT *values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a78d8ac95a740d405c761c73166c9b787',1,'pcs::CppStringT::TransTable::TransTable(const CharT *keys, const CharT *values, const CharT *not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a551b96c6c0ab2bf9183de0bfcc6770a2',1,'pcs::CppStringT::TransTable::TransTable(KeyIt first_key, KeyIt last_key, ValueIt first_value, ValueIt last_value)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a1c10bb78e74942f88247cde65a03d557',1,'pcs::CppStringT::TransTable::TransTable(Key1It first_key, Key1It last_key, ValueIt first_value, ValueIt last_value, Key2It first_not_translated, Key2It last_not_translated)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a21791e46266edb8eea13876559b352a2',1,'pcs::CppStringT::TransTable::TransTable(const StringViewLike &keys, const StringViewLike &values)'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a7da38829b171a7a9147b43086e067454',1,'pcs::CppStringT::TransTable::TransTable() noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#a69a3ab2775d7e6537528a3eba3c4134a',1,'pcs::CppStringT::TransTable::TransTable(const TransTable &) noexcept=default'],['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#aa9182c3323cdba7f6dd30bfa56ebb8fe',1,'pcs::CppStringT::TransTable::TransTable(TransTable &&) noexcept=default']]] +]; diff --git a/cpp-strings/html/search/functions_d.js b/documentation/search/all_e.js similarity index 100% rename from cpp-strings/html/search/functions_d.js rename to documentation/search/all_e.js diff --git a/cpp-strings/html/search/functions_e.js b/documentation/search/all_f.js similarity index 100% rename from cpp-strings/html/search/functions_e.js rename to documentation/search/all_f.js diff --git a/cpp-strings/html/search/classes_0.js b/documentation/search/classes_0.js similarity index 100% rename from cpp-strings/html/search/classes_0.js rename to documentation/search/classes_0.js diff --git a/cpp-strings/html/search/classes_1.js b/documentation/search/classes_1.js similarity index 100% rename from cpp-strings/html/search/classes_1.js rename to documentation/search/classes_1.js diff --git a/cpp-strings/html/search/classes_2.js b/documentation/search/classes_2.js similarity index 100% rename from cpp-strings/html/search/classes_2.js rename to documentation/search/classes_2.js diff --git a/cpp-strings/html/search/classes_3.js b/documentation/search/classes_3.js similarity index 100% rename from cpp-strings/html/search/classes_3.js rename to documentation/search/classes_3.js diff --git a/cpp-strings/html/search/functions_0.js b/documentation/search/functions_0.js similarity index 100% rename from cpp-strings/html/search/functions_0.js rename to documentation/search/functions_0.js diff --git a/cpp-strings/html/search/functions_1.js b/documentation/search/functions_1.js similarity index 100% rename from cpp-strings/html/search/functions_1.js rename to documentation/search/functions_1.js diff --git a/cpp-strings/html/search/all_7.js b/documentation/search/functions_2.js similarity index 77% rename from cpp-strings/html/search/all_7.js rename to documentation/search/functions_2.js index 69d5fd0..d88008c 100644 --- a/cpp-strings/html/search/all_7.js +++ b/documentation/search/functions_2.js @@ -1,8 +1,7 @@ var searchData= [ - ['easy_20to_20use_20as_20python_20strings_0',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]], - ['end_1',['end',['../classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c',1,'pcs::Slice']]], - ['endswith_2',['endswith',['../classpcs_1_1_cpp_string_t.html#a42f1e87d7f1903536ee79aa058d5c867',1,'pcs::CppStringT::endswith(const CppStringT &suffix, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b23210d7d5eb07c9f942d62cc76b05e',1,'pcs::CppStringT::endswith(const CppStringT &suffix, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a3e9da0bfa54e84420e81668f6ce7f52c',1,'pcs::CppStringT::endswith(const CppStringT &suffix) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a87b25fce2a05421efd718c599a784a09',1,'pcs::CppStringT::endswith(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type end) const noexcept']]], - ['endswith_5fn_3',['endswith_n',['../classpcs_1_1_cpp_string_t.html#a7eca5636b598c6fc107452ddd04a2f17',1,'pcs::CppStringT::endswith_n(const CppStringT &suffix, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a619935926ef961883e9bbd92b2fc23bd',1,'pcs::CppStringT::endswith_n(const CppStringT &suffix, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a4fd91047ab0126c823aa391a699e03bf',1,'pcs::CppStringT::endswith_n(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type count) const noexcept']]], - ['expand_5ftabs_4',['expand_tabs',['../classpcs_1_1_cpp_string_t.html#a2cc04d5062162ff5f7b6111d6f1e78e8',1,'pcs::CppStringT']]] + ['end_0',['end',['../classpcs_1_1_slice.html#aee5b0e0110ef1ee32763da9b2386b59c',1,'pcs::Slice']]], + ['endswith_1',['endswith',['../classpcs_1_1_cpp_string_t.html#a42f1e87d7f1903536ee79aa058d5c867',1,'pcs::CppStringT::endswith(const CppStringT &suffix, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b23210d7d5eb07c9f942d62cc76b05e',1,'pcs::CppStringT::endswith(const CppStringT &suffix, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a3e9da0bfa54e84420e81668f6ce7f52c',1,'pcs::CppStringT::endswith(const CppStringT &suffix) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a87b25fce2a05421efd718c599a784a09',1,'pcs::CppStringT::endswith(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type end) const noexcept']]], + ['endswith_5fn_2',['endswith_n',['../classpcs_1_1_cpp_string_t.html#a7eca5636b598c6fc107452ddd04a2f17',1,'pcs::CppStringT::endswith_n(const CppStringT &suffix, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a619935926ef961883e9bbd92b2fc23bd',1,'pcs::CppStringT::endswith_n(const CppStringT &suffix, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a4fd91047ab0126c823aa391a699e03bf',1,'pcs::CppStringT::endswith_n(const std::initializer_list< CppStringT > &suffixes, const size_type start, const size_type count) const noexcept']]], + ['expand_5ftabs_3',['expand_tabs',['../classpcs_1_1_cpp_string_t.html#a2cc04d5062162ff5f7b6111d6f1e78e8',1,'pcs::CppStringT']]] ]; diff --git a/cpp-strings/html/search/functions_3.js b/documentation/search/functions_3.js similarity index 100% rename from cpp-strings/html/search/functions_3.js rename to documentation/search/functions_3.js diff --git a/cpp-strings/html/search/functions_4.js b/documentation/search/functions_4.js similarity index 100% rename from cpp-strings/html/search/functions_4.js rename to documentation/search/functions_4.js diff --git a/documentation/search/functions_5.js b/documentation/search/functions_5.js new file mode 100644 index 0000000..dbd8f90 --- /dev/null +++ b/documentation/search/functions_5.js @@ -0,0 +1,49 @@ +var searchData= +[ + ['index_0',['index',['../classpcs_1_1_cpp_string_t.html#a277a2b8a3b93951ccb94b6bf39daa582',1,'pcs::CppStringT']]], + ['index_5fn_1',['index_n',['../classpcs_1_1_cpp_string_t.html#aee94d4b52483021051b168e776b18569',1,'pcs::CppStringT::index_n(const CppStringT &sub, const size_type start, const size_type count) const'],['../classpcs_1_1_cpp_string_t.html#a19a51054b824add817f30c5ff03effe7',1,'pcs::CppStringT::index_n(const CppStringT &sub, const size_type count) const']]], + ['is_5falpha_2',['is_alpha',['../namespacepcs.html#a40bc3d234e3c737f34d267151ca62014',1,'pcs']]], + ['is_5falpha_3c_20char_20_3e_3',['is_alpha< char >',['../namespacepcs.html#ade5b26313fc856bb882109d6945629b8',1,'pcs']]], + ['is_5falpha_3c_20wchar_5ft_20_3e_4',['is_alpha< wchar_t >',['../namespacepcs.html#a069625790af3ecf05a424c2c53eabfc0',1,'pcs']]], + ['is_5fascii_5',['is_ascii',['../namespacepcs.html#ac7822fd0c570f69d597936a24c38ba2a',1,'pcs']]], + ['is_5fdecimal_6',['is_decimal',['../namespacepcs.html#a9f0ba4e85fc273fad1a8b489f3be7fa8',1,'pcs']]], + ['is_5fdecimal_3c_20char_20_3e_7',['is_decimal< char >',['../namespacepcs.html#a28f77929d599a862403a4471f6b73fc3',1,'pcs']]], + ['is_5fdecimal_3c_20wchar_5ft_20_3e_8',['is_decimal< wchar_t >',['../namespacepcs.html#a60a2017b25d3d06b83e72f5ed5a93d09',1,'pcs']]], + ['is_5fdigit_9',['is_digit',['../namespacepcs.html#a52b12f8beb4ab7d8b819ca24180e08d1',1,'pcs']]], + ['is_5fdigit_3c_20char_20_3e_10',['is_digit< char >',['../namespacepcs.html#af7c58514e3378a219904f22eb22e9072',1,'pcs']]], + ['is_5fdigit_3c_20wchar_5ft_20_3e_11',['is_digit< wchar_t >',['../namespacepcs.html#a01c6093b1a8ef52114f799635ff930d5',1,'pcs']]], + ['is_5fid_5fcontinue_12',['is_id_continue',['../namespacepcs.html#aef0240331a343bb1ad13eb613ca93fa4',1,'pcs']]], + ['is_5fid_5fstart_13',['is_id_start',['../namespacepcs.html#abfda7874fe5b1f72c1c5a9a04d5c7e42',1,'pcs']]], + ['is_5flower_14',['is_lower',['../namespacepcs.html#aedd570e9ffa0572d56fce5085594bdbb',1,'pcs']]], + ['is_5flower_3c_20char_20_3e_15',['is_lower< char >',['../namespacepcs.html#a29893984c95e53a6efe01f74c2dcc03a',1,'pcs']]], + ['is_5flower_3c_20wchar_5ft_20_3e_16',['is_lower< wchar_t >',['../namespacepcs.html#ad1d1b13c16ce784055e93af9fa34fb5c',1,'pcs']]], + ['is_5fnumeric_17',['is_numeric',['../namespacepcs.html#af1b60c1081e8bc3b4cd91fbe240e9b87',1,'pcs']]], + ['is_5fnumeric_3c_20char_20_3e_18',['is_numeric< char >',['../namespacepcs.html#a242e3c28e3d47d19d70ab70d83e74d35',1,'pcs']]], + ['is_5fnumeric_3c_20wchar_5ft_20_3e_19',['is_numeric< wchar_t >',['../namespacepcs.html#acab7e7bb1ffd6e4ea1a8300b05478647',1,'pcs']]], + ['is_5fprintable_20',['is_printable',['../namespacepcs.html#a51cd6883557ab31a1e0c8e7b5ab27351',1,'pcs']]], + ['is_5fprintable_3c_20char_20_3e_21',['is_printable< char >',['../namespacepcs.html#a1cd19ec212e3ada992a8effb8d5d872d',1,'pcs']]], + ['is_5fprintable_3c_20wchar_5ft_20_3e_22',['is_printable< wchar_t >',['../namespacepcs.html#a30ed0cd7942d081369f78a49a029d8b1',1,'pcs']]], + ['is_5fpunctuation_23',['is_punctuation',['../namespacepcs.html#a02d340dd9c510eda0fbfed07a08d0792',1,'pcs']]], + ['is_5fpunctuation_3c_20char_20_3e_24',['is_punctuation< char >',['../namespacepcs.html#aa36d34c2227cde5856e8d61fa6e4af58',1,'pcs']]], + ['is_5fpunctuation_3c_20wchar_5ft_20_3e_25',['is_punctuation< wchar_t >',['../namespacepcs.html#a363e2bac9c403a623c5a410f7113edd3',1,'pcs']]], + ['is_5fspace_26',['is_space',['../namespacepcs.html#af089ceadbeaab27e12ad7f7edaaec72a',1,'pcs']]], + ['is_5fspace_3c_20char_20_3e_27',['is_space< char >',['../namespacepcs.html#a714cfa835ef4db5180309829ee8e27a9',1,'pcs']]], + ['is_5fspace_3c_20wchar_5ft_20_3e_28',['is_space< wchar_t >',['../namespacepcs.html#a57a765c6eb624107a2176a56cf2220a7',1,'pcs']]], + ['is_5fupper_29',['is_upper',['../namespacepcs.html#a8cb1cd0a1e39d92893eb7d22145f5d65',1,'pcs']]], + ['is_5fupper_3c_20char_20_3e_30',['is_upper< char >',['../namespacepcs.html#ac25d471fa1d838401335776ad4b6ead1',1,'pcs']]], + ['is_5fupper_3c_20wchar_5ft_20_3e_31',['is_upper< wchar_t >',['../namespacepcs.html#ab5077443809e9e4eb7bfa463728f398a',1,'pcs']]], + ['is_5fwords_5fsep_32',['is_words_sep',['../classpcs_1_1_cpp_string_t.html#a7565e4f2958e485ee2b0815be1faa0fa',1,'pcs::CppStringT']]], + ['isalnum_33',['isalnum',['../classpcs_1_1_cpp_string_t.html#a8fdf96ffee524d5b795c4aad26ece6ae',1,'pcs::CppStringT']]], + ['isalpha_34',['isalpha',['../classpcs_1_1_cpp_string_t.html#a447b7c58b4be1cdcba3aedf189acbce7',1,'pcs::CppStringT']]], + ['isascii_35',['isascii',['../classpcs_1_1_cpp_string_t.html#a710631f31d4c63c2117e8f4804fad3f2',1,'pcs::CppStringT']]], + ['isdecimal_36',['isdecimal',['../classpcs_1_1_cpp_string_t.html#a0b9d8a55419274e7cfd9badb4df704e3',1,'pcs::CppStringT']]], + ['isdigit_37',['isdigit',['../classpcs_1_1_cpp_string_t.html#a21316d00180377a3f48910a6c4c43b9c',1,'pcs::CppStringT']]], + ['isidentifier_38',['isidentifier',['../classpcs_1_1_cpp_string_t.html#a91f72d425dbb4c53a066338d30683246',1,'pcs::CppStringT']]], + ['islower_39',['islower',['../classpcs_1_1_cpp_string_t.html#ae4ff448bb92e6499c0a76f7d8e11126c',1,'pcs::CppStringT']]], + ['isnumeric_40',['isnumeric',['../classpcs_1_1_cpp_string_t.html#a578176ed20fd8da965afbcae1d99dd59',1,'pcs::CppStringT']]], + ['isprintable_41',['isprintable',['../classpcs_1_1_cpp_string_t.html#a6257a1832da550d4be32e9f272e51265',1,'pcs::CppStringT']]], + ['ispunctuation_42',['ispunctuation',['../classpcs_1_1_cpp_string_t.html#a2842f3a067fdc674709bed048d64e12d',1,'pcs::CppStringT']]], + ['isspace_43',['isspace',['../classpcs_1_1_cpp_string_t.html#a959a8f56bb536f2474ffc649a7ad3290',1,'pcs::CppStringT']]], + ['istitle_44',['istitle',['../classpcs_1_1_cpp_string_t.html#ad72611f339c2b9027a72fa26f25748c3',1,'pcs::CppStringT']]], + ['isupper_45',['isupper',['../classpcs_1_1_cpp_string_t.html#af2784cbe9655bb8e23fe90375d79e69c',1,'pcs::CppStringT']]] +]; diff --git a/cpp-strings/html/search/functions_6.js b/documentation/search/functions_6.js similarity index 100% rename from cpp-strings/html/search/functions_6.js rename to documentation/search/functions_6.js diff --git a/cpp-strings/html/search/all_c.js b/documentation/search/functions_7.js similarity index 50% rename from cpp-strings/html/search/all_c.js rename to documentation/search/functions_7.js index 49c383d..75c044b 100644 --- a/cpp-strings/html/search/all_c.js +++ b/documentation/search/functions_7.js @@ -1,9 +1,6 @@ var searchData= [ - ['latest_20release_20release_201_200_201_200_200_20229_202025_2007_0',['Latest Release - Release 1.0 (1.0.0.229) 2025/07',['../index.html#autotoc_md6',1,'']]], - ['library_20cpp_20strings_1',['Library cpp-strings',['../index.html',1,'']]], - ['license_2',['License',['../index.html#autotoc_md3',1,'']]], - ['ljust_3',['ljust',['../classpcs_1_1_cpp_string_t.html#aed96c44c384cab45342122cd7e2f02eb',1,'pcs::CppStringT']]], - ['lower_4',['lower',['../classpcs_1_1_cpp_string_t.html#ad5c765eaa85cb4a3e7a914d55a6a5175',1,'pcs::CppStringT::lower() noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b1cfc9713e55a48f036ed030bedc654',1,'pcs::CppStringT::lower(const value_type ch) noexcept']]], - ['lstrip_5',['lstrip',['../classpcs_1_1_cpp_string_t.html#aee6e48d5b478d5bab239f54523d23c15',1,'pcs::CppStringT::lstrip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ac1ad3018d38f291e6debad8d2de92be1',1,'pcs::CppStringT::lstrip() const noexcept']]] + ['ljust_0',['ljust',['../classpcs_1_1_cpp_string_t.html#aed96c44c384cab45342122cd7e2f02eb',1,'pcs::CppStringT']]], + ['lower_1',['lower',['../classpcs_1_1_cpp_string_t.html#ad5c765eaa85cb4a3e7a914d55a6a5175',1,'pcs::CppStringT::lower() noexcept'],['../classpcs_1_1_cpp_string_t.html#a6b1cfc9713e55a48f036ed030bedc654',1,'pcs::CppStringT::lower(const value_type ch) noexcept']]], + ['lstrip_2',['lstrip',['../classpcs_1_1_cpp_string_t.html#aee6e48d5b478d5bab239f54523d23c15',1,'pcs::CppStringT::lstrip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ac1ad3018d38f291e6debad8d2de92be1',1,'pcs::CppStringT::lstrip() const noexcept']]] ]; diff --git a/cpp-strings/html/search/functions_8.js b/documentation/search/functions_8.js similarity index 100% rename from cpp-strings/html/search/functions_8.js rename to documentation/search/functions_8.js diff --git a/cpp-strings/html/search/functions_9.js b/documentation/search/functions_9.js similarity index 100% rename from cpp-strings/html/search/functions_9.js rename to documentation/search/functions_9.js diff --git a/documentation/search/functions_a.js b/documentation/search/functions_a.js new file mode 100644 index 0000000..e610e4b --- /dev/null +++ b/documentation/search/functions_a.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['removeprefix_0',['removeprefix',['../classpcs_1_1_cpp_string_t.html#a058704b7f4538ec9e1798c5348d37c7a',1,'pcs::CppStringT']]], + ['removesuffix_1',['removesuffix',['../classpcs_1_1_cpp_string_t.html#ad6a8dc124ab8b7cab1cb328240763ed0',1,'pcs::CppStringT']]], + ['replace_2',['replace',['../classpcs_1_1_cpp_string_t.html#ad4f39683db649aa8a65907268c499f02',1,'pcs::CppStringT']]], + ['rfind_3',['rfind',['../classpcs_1_1_cpp_string_t.html#af363308ba741b267641e1aa35669d603',1,'pcs::CppStringT::rfind(const CppStringT &sub, const size_type start, const size_type end) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a9f43f20029596abc1362d1242e68e5db',1,'pcs::CppStringT::rfind(const CppStringT &sub, const size_type start) const noexcept'],['../classpcs_1_1_cpp_string_t.html#ac00bb6f7d74bfdde0d4cc247e78ab20e',1,'pcs::CppStringT::rfind(const CppStringT &sub) const noexcept']]], + ['rfind_5fn_4',['rfind_n',['../classpcs_1_1_cpp_string_t.html#a519a292eb3f0790d54a59a201f2d6410',1,'pcs::CppStringT::rfind_n(const CppStringT &sub, const size_type start, const size_type count) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a790f663f51dfe6e9e15d4f5f025bf107',1,'pcs::CppStringT::rfind_n(const CppStringT &sub, const size_type count) const noexcept']]], + ['rindex_5',['rindex',['../classpcs_1_1_cpp_string_t.html#a6693ec49258c6ac80a7875b3ebf3c916',1,'pcs::CppStringT::rindex(const CppStringT &sub, const size_type start, const size_type end) const'],['../classpcs_1_1_cpp_string_t.html#a2baca0ddff848de56a7b867f68d3efab',1,'pcs::CppStringT::rindex(const CppStringT &sub, const size_type start) const'],['../classpcs_1_1_cpp_string_t.html#a546105cc9a8a9d493979c30607092cf1',1,'pcs::CppStringT::rindex(const CppStringT &sub) const']]], + ['rindex_5fn_6',['rindex_n',['../classpcs_1_1_cpp_string_t.html#afc08a4e91b93710838c8f0d6234e057e',1,'pcs::CppStringT::rindex_n(const CppStringT &sub, const size_type start, const size_type count) const'],['../classpcs_1_1_cpp_string_t.html#ac3079cbecbdf4151e66f602f39ece836',1,'pcs::CppStringT::rindex_n(const CppStringT &sub, const size_type count) const']]], + ['rjust_7',['rjust',['../classpcs_1_1_cpp_string_t.html#a61fd4215938ec9f0fce1f885d6bb4a2b',1,'pcs::CppStringT']]], + ['rpartition_8',['rpartition',['../classpcs_1_1_cpp_string_t.html#a61674ee4e97038d82ea7ecc30b1761f6',1,'pcs::CppStringT']]], + ['rsplit_9',['rsplit',['../classpcs_1_1_cpp_string_t.html#a8111cd357773d304fbb496571d7ee6be',1,'pcs::CppStringT::rsplit() noexcept'],['../classpcs_1_1_cpp_string_t.html#a0419f46de6fa532372f3b97b4927ebab',1,'pcs::CppStringT::rsplit(const CppStringT &sep) noexcept'],['../classpcs_1_1_cpp_string_t.html#a3aa66706e268bd570a0084d70dff5cde',1,'pcs::CppStringT::rsplit(const size_type maxsplit) noexcept'],['../classpcs_1_1_cpp_string_t.html#ab0ace502f0b3026fefd2942a1e8a0456',1,'pcs::CppStringT::rsplit(const CppStringT &sep, const size_type maxsplit) noexcept']]], + ['rstrip_10',['rstrip',['../classpcs_1_1_cpp_string_t.html#a89e850d45d6dec167e763cf748a06971',1,'pcs::CppStringT::rstrip(const CppStringT &removedchars) const noexcept'],['../classpcs_1_1_cpp_string_t.html#a86f8c78b2eeb3541fb6b56b4f4ac237b',1,'pcs::CppStringT::rstrip() const noexcept']]] +]; diff --git a/cpp-strings/html/search/functions_b.js b/documentation/search/functions_b.js similarity index 100% rename from cpp-strings/html/search/functions_b.js rename to documentation/search/functions_b.js diff --git a/cpp-strings/html/search/functions_c.js b/documentation/search/functions_c.js similarity index 100% rename from cpp-strings/html/search/functions_c.js rename to documentation/search/functions_c.js diff --git a/cpp-strings/html/search/all_14.js b/documentation/search/functions_d.js similarity index 65% rename from cpp-strings/html/search/all_14.js rename to documentation/search/functions_d.js index 714c8b3..f09eceb 100644 --- a/cpp-strings/html/search/all_14.js +++ b/documentation/search/functions_d.js @@ -1,5 +1,4 @@ var searchData= [ - ['upper_0',['upper',['../classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120',1,'pcs::CppStringT::upper() noexcept'],['../classpcs_1_1_cpp_string_t.html#af5ff8cdba1d90516915e20f93567a9a9',1,'pcs::CppStringT::upper(const value_type ch) noexcept']]], - ['use_20as_20python_20strings_1',['What if c++ strings where as easy to use as Python strings?',['../index.html#autotoc_md1',1,'']]] + ['upper_0',['upper',['../classpcs_1_1_cpp_string_t.html#a689d2de98f28d131bb0c8b3c87f2f120',1,'pcs::CppStringT::upper() noexcept'],['../classpcs_1_1_cpp_string_t.html#af5ff8cdba1d90516915e20f93567a9a9',1,'pcs::CppStringT::upper(const value_type ch) noexcept']]] ]; diff --git a/documentation/search/functions_e.js b/documentation/search/functions_e.js new file mode 100644 index 0000000..09848bb --- /dev/null +++ b/documentation/search/functions_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['zfill_0',['zfill',['../classpcs_1_1_cpp_string_t.html#ad3d2b94f37325096205e399b95e9fc5d',1,'pcs::CppStringT']]] +]; diff --git a/documentation/search/functions_f.js b/documentation/search/functions_f.js new file mode 100644 index 0000000..d67d134 --- /dev/null +++ b/documentation/search/functions_f.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['_7eslice_0',['~Slice',['../classpcs_1_1_slice.html#abdb6694913ed37cf4efc5d85e990c7b5',1,'pcs::Slice']]], + ['_7estartslice_1',['~StartSlice',['../structpcs_1_1_start_slice.html#a6f792a61218b7598f8f6bb37dcdae56e',1,'pcs::StartSlice']]], + ['_7estartstepslice_2',['~StartStepSlice',['../structpcs_1_1_start_step_slice.html#adc0aae8a3849379742e23c4f3a3197a9',1,'pcs::StartStepSlice']]], + ['_7estartstopslice_3',['~StartStopSlice',['../structpcs_1_1_start_stop_slice.html#a95df964c79860a475a63da3e56301ea7',1,'pcs::StartStopSlice']]], + ['_7estepslice_4',['~StepSlice',['../structpcs_1_1_step_slice.html#a93892e4d8f153a06a65e0cd13ebfa949',1,'pcs::StepSlice']]], + ['_7estopslice_5',['~StopSlice',['../structpcs_1_1_stop_slice.html#a6e7e761a846ec00b1f24be9f83830f25',1,'pcs::StopSlice']]], + ['_7estopstepslice_6',['~StopStepSlice',['../structpcs_1_1_stop_step_slice.html#aa62d3d31f646766a6ea2ef3cd9f91491',1,'pcs::StopStepSlice']]], + ['_7etranstable_7',['~TransTable',['../classpcs_1_1_cpp_string_t_1_1_trans_table.html#abbbcd9cf0c3ac0a364864f734363dd4c',1,'pcs::CppStringT::TransTable']]] +]; diff --git a/cpp-strings/html/search/namespaces_0.js b/documentation/search/namespaces_0.js similarity index 100% rename from cpp-strings/html/search/namespaces_0.js rename to documentation/search/namespaces_0.js diff --git a/documentation/search/pages_0.js b/documentation/search/pages_0.js new file mode 100644 index 0000000..0c2600b --- /dev/null +++ b/documentation/search/pages_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['0_0',['Missing parts in Release 1.0',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md6',1,'']]], + ['0_201_200_202_20232_202025_2007_1',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], + ['0_202_20232_202025_2007_2',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], + ['07_3',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]] +]; diff --git a/documentation/search/pages_1.js b/documentation/search/pages_1.js new file mode 100644 index 0000000..f074ebd --- /dev/null +++ b/documentation/search/pages_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['1_200_0',['Missing parts in Release 1.0',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md6',1,'']]], + ['1_200_201_200_202_20232_202025_2007_1',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], + ['1_200_202_20232_202025_2007_2',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]] +]; diff --git a/documentation/search/pages_2.js b/documentation/search/pages_2.js new file mode 100644 index 0000000..82f6ad9 --- /dev/null +++ b/documentation/search/pages_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['2_20232_202025_2007_0',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], + ['2025_2007_1',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], + ['232_202025_2007_2',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]] +]; diff --git a/documentation/search/pages_3.js b/documentation/search/pages_3.js new file mode 100644 index 0000000..d5e0ef2 --- /dev/null +++ b/documentation/search/pages_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]], + ['as_20python_20strings_1',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/documentation/search/pages_4.js b/documentation/search/pages_4.js new file mode 100644 index 0000000..c94e101 --- /dev/null +++ b/documentation/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['c_20strings_20were_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/documentation/search/pages_5.js b/documentation/search/pages_5.js new file mode 100644 index 0000000..a947933 --- /dev/null +++ b/documentation/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['documentation_0',['Documentation',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md8',1,'']]] +]; diff --git a/documentation/search/pages_6.js b/documentation/search/pages_6.js new file mode 100644 index 0000000..67aef50 --- /dev/null +++ b/documentation/search/pages_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['easy_20to_20use_20as_20python_20strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/documentation/search/pages_7.js b/documentation/search/pages_7.js new file mode 100644 index 0000000..b4a53d4 --- /dev/null +++ b/documentation/search/pages_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['if_20c_20strings_20were_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]], + ['in_20release_201_200_1',['Missing parts in Release 1.0',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md6',1,'']]], + ['intro_2',['Intro',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md3',1,'']]] +]; diff --git a/documentation/search/pages_8.js b/documentation/search/pages_8.js new file mode 100644 index 0000000..c7e1aca --- /dev/null +++ b/documentation/search/pages_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['latest_20release_20release_201_200_201_200_202_20232_202025_2007_0',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], + ['license_1',['License',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md2',1,'']]] +]; diff --git a/documentation/search/pages_9.js b/documentation/search/pages_9.js new file mode 100644 index 0000000..7467650 --- /dev/null +++ b/documentation/search/pages_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['missing_20parts_20in_20release_201_200_0',['Missing parts in Release 1.0',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md6',1,'']]] +]; diff --git a/documentation/search/pages_a.js b/documentation/search/pages_a.js new file mode 100644 index 0000000..fe4dd52 --- /dev/null +++ b/documentation/search/pages_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['parts_20in_20release_201_200_0',['Missing parts in Release 1.0',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md6',1,'']]], + ['python_20strings_1',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/documentation/search/pages_b.js b/documentation/search/pages_b.js new file mode 100644 index 0000000..cb1c625 --- /dev/null +++ b/documentation/search/pages_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['release_201_200_0',['Missing parts in Release 1.0',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md6',1,'']]], + ['release_201_200_201_200_202_20232_202025_2007_1',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]], + ['release_20release_201_200_201_200_202_20232_202025_2007_2',['Latest Release - Release 1.0 (1.0.2.232) 2025/07',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md5',1,'']]] +]; diff --git a/documentation/search/pages_c.js b/documentation/search/pages_c.js new file mode 100644 index 0000000..8dfeb5d --- /dev/null +++ b/documentation/search/pages_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]], + ['strings_20were_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/documentation/search/pages_d.js b/documentation/search/pages_d.js new file mode 100644 index 0000000..9ed4826 --- /dev/null +++ b/documentation/search/pages_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['to_20use_20as_20python_20strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/documentation/search/pages_e.js b/documentation/search/pages_e.js new file mode 100644 index 0000000..2fa32cb --- /dev/null +++ b/documentation/search/pages_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['use_20as_20python_20strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/documentation/search/pages_f.js b/documentation/search/pages_f.js new file mode 100644 index 0000000..78dfefc --- /dev/null +++ b/documentation/search/pages_f.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['were_20as_20easy_20to_20use_20as_20python_20strings_0',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]], + ['what_20if_20c_20strings_20were_20as_20easy_20to_20use_20as_20python_20strings_1',['What if c++ strings were as easy to use as Python strings?',['../E:/GitHub/pythonic-cpp-strings/cpp-strings/README.md#autotoc_md0',1,'']]] +]; diff --git a/cpp-strings/html/search/search.css b/documentation/search/search.css similarity index 100% rename from cpp-strings/html/search/search.css rename to documentation/search/search.css diff --git a/cpp-strings/html/search/search.js b/documentation/search/search.js similarity index 100% rename from cpp-strings/html/search/search.js rename to documentation/search/search.js diff --git a/cpp-strings/html/search/searchdata.js b/documentation/search/searchdata.js similarity index 68% rename from cpp-strings/html/search/searchdata.js rename to documentation/search/searchdata.js index bf2a899..6edd231 100644 --- a/cpp-strings/html/search/searchdata.js +++ b/documentation/search/searchdata.js @@ -1,11 +1,10 @@ var indexSectionsWithContent = { - 0: "012abcdefgijlmnoprstuwz~", + 0: "bcefgijlnoprstuz~", 1: "cnst", 2: "p", 3: "bcefgijloprstuz~", - 4: "c", - 5: "012acdeilmprstuw" + 4: "c" }; var indexSectionNames = @@ -14,8 +13,7 @@ var indexSectionNames = 1: "classes", 2: "namespaces", 3: "functions", - 4: "typedefs", - 5: "pages" + 4: "typedefs" }; var indexSectionLabels = @@ -24,7 +22,6 @@ var indexSectionLabels = 1: "Classes", 2: "Namespaces", 3: "Functions", - 4: "Typedefs", - 5: "Pages" + 4: "Typedefs" }; diff --git a/cpp-strings/html/search/typedefs_0.js b/documentation/search/typedefs_0.js similarity index 100% rename from cpp-strings/html/search/typedefs_0.js rename to documentation/search/typedefs_0.js diff --git a/cpp-strings/html/structpcs_1_1_start_slice-members.html b/documentation/structpcs_1_1_start_slice-members.html similarity index 99% rename from cpp-strings/html/structpcs_1_1_start_slice-members.html rename to documentation/structpcs_1_1_start_slice-members.html index 248e430..3cb0508 100644 --- a/cpp-strings/html/structpcs_1_1_start_slice-members.html +++ b/documentation/structpcs_1_1_start_slice-members.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/structpcs_1_1_start_slice.html b/documentation/structpcs_1_1_start_slice.html similarity index 98% rename from cpp-strings/html/structpcs_1_1_start_slice.html rename to documentation/structpcs_1_1_start_slice.html index 7371c27..9eba63d 100644 --- a/cpp-strings/html/structpcs_1_1_start_slice.html +++ b/documentation/structpcs_1_1_start_slice.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    @@ -93,7 +93,7 @@

    Base class for slices, with start, stop and step specified values. More...

    -

    #include <cppstrings.h>

    +

    #include <cppstrings.h>

    Inheritance diagram for pcs::StartSlice< IntT >:
    @@ -212,7 +212,7 @@

    cppstrings.h +
  • cppstrings.h
  • diff --git a/cpp-strings/html/structpcs_1_1_start_slice.js b/documentation/structpcs_1_1_start_slice.js similarity index 100% rename from cpp-strings/html/structpcs_1_1_start_slice.js rename to documentation/structpcs_1_1_start_slice.js diff --git a/cpp-strings/html/structpcs_1_1_start_slice.png b/documentation/structpcs_1_1_start_slice.png similarity index 100% rename from cpp-strings/html/structpcs_1_1_start_slice.png rename to documentation/structpcs_1_1_start_slice.png diff --git a/cpp-strings/html/structpcs_1_1_start_step_slice-members.html b/documentation/structpcs_1_1_start_step_slice-members.html similarity index 99% rename from cpp-strings/html/structpcs_1_1_start_step_slice-members.html rename to documentation/structpcs_1_1_start_step_slice-members.html index a525579..0df13cd 100644 --- a/cpp-strings/html/structpcs_1_1_start_step_slice-members.html +++ b/documentation/structpcs_1_1_start_step_slice-members.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/structpcs_1_1_start_step_slice.html b/documentation/structpcs_1_1_start_step_slice.html similarity index 98% rename from cpp-strings/html/structpcs_1_1_start_step_slice.html rename to documentation/structpcs_1_1_start_step_slice.html index b3885fe..b2c4196 100644 --- a/cpp-strings/html/structpcs_1_1_start_step_slice.html +++ b/documentation/structpcs_1_1_start_step_slice.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    @@ -93,7 +93,7 @@

    struct of slices with default step values More...

    -

    #include <cppstrings.h>

    +

    #include <cppstrings.h>

    Inheritance diagram for pcs::StartStepSlice< IntT >:
    @@ -216,7 +216,7 @@

    cppstrings.h +
  • cppstrings.h
  • diff --git a/cpp-strings/html/structpcs_1_1_start_step_slice.js b/documentation/structpcs_1_1_start_step_slice.js similarity index 100% rename from cpp-strings/html/structpcs_1_1_start_step_slice.js rename to documentation/structpcs_1_1_start_step_slice.js diff --git a/cpp-strings/html/structpcs_1_1_start_step_slice.png b/documentation/structpcs_1_1_start_step_slice.png similarity index 100% rename from cpp-strings/html/structpcs_1_1_start_step_slice.png rename to documentation/structpcs_1_1_start_step_slice.png diff --git a/cpp-strings/html/structpcs_1_1_start_stop_slice-members.html b/documentation/structpcs_1_1_start_stop_slice-members.html similarity index 99% rename from cpp-strings/html/structpcs_1_1_start_stop_slice-members.html rename to documentation/structpcs_1_1_start_stop_slice-members.html index 24e0401..b35dccd 100644 --- a/cpp-strings/html/structpcs_1_1_start_stop_slice-members.html +++ b/documentation/structpcs_1_1_start_stop_slice-members.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/structpcs_1_1_start_stop_slice.html b/documentation/structpcs_1_1_start_stop_slice.html similarity index 98% rename from cpp-strings/html/structpcs_1_1_start_stop_slice.html rename to documentation/structpcs_1_1_start_stop_slice.html index e95b7ea..f72cd1d 100644 --- a/cpp-strings/html/structpcs_1_1_start_stop_slice.html +++ b/documentation/structpcs_1_1_start_stop_slice.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    @@ -93,7 +93,7 @@

    struct of slices with default start and stop values More...

    -

    #include <cppstrings.h>

    +

    #include <cppstrings.h>

    Inheritance diagram for pcs::StartStopSlice< IntT >:
    @@ -216,7 +216,7 @@

    cppstrings.h +
  • cppstrings.h
  • diff --git a/cpp-strings/html/structpcs_1_1_start_stop_slice.js b/documentation/structpcs_1_1_start_stop_slice.js similarity index 100% rename from cpp-strings/html/structpcs_1_1_start_stop_slice.js rename to documentation/structpcs_1_1_start_stop_slice.js diff --git a/cpp-strings/html/structpcs_1_1_start_stop_slice.png b/documentation/structpcs_1_1_start_stop_slice.png similarity index 100% rename from cpp-strings/html/structpcs_1_1_start_stop_slice.png rename to documentation/structpcs_1_1_start_stop_slice.png diff --git a/cpp-strings/html/structpcs_1_1_step_slice-members.html b/documentation/structpcs_1_1_step_slice-members.html similarity index 99% rename from cpp-strings/html/structpcs_1_1_step_slice-members.html rename to documentation/structpcs_1_1_step_slice-members.html index b18bdcd..6e28849 100644 --- a/cpp-strings/html/structpcs_1_1_step_slice-members.html +++ b/documentation/structpcs_1_1_step_slice-members.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/structpcs_1_1_step_slice.html b/documentation/structpcs_1_1_step_slice.html similarity index 98% rename from cpp-strings/html/structpcs_1_1_step_slice.html rename to documentation/structpcs_1_1_step_slice.html index 2d7053c..b2090e5 100644 --- a/cpp-strings/html/structpcs_1_1_step_slice.html +++ b/documentation/structpcs_1_1_step_slice.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    @@ -93,7 +93,7 @@

    struct of slices with default start and step values More...

    -

    #include <cppstrings.h>

    +

    #include <cppstrings.h>

    Inheritance diagram for pcs::StepSlice< IntT >:
    @@ -212,7 +212,7 @@

    cppstrings.h +
  • cppstrings.h
  • diff --git a/cpp-strings/html/structpcs_1_1_step_slice.js b/documentation/structpcs_1_1_step_slice.js similarity index 100% rename from cpp-strings/html/structpcs_1_1_step_slice.js rename to documentation/structpcs_1_1_step_slice.js diff --git a/cpp-strings/html/structpcs_1_1_step_slice.png b/documentation/structpcs_1_1_step_slice.png similarity index 100% rename from cpp-strings/html/structpcs_1_1_step_slice.png rename to documentation/structpcs_1_1_step_slice.png diff --git a/cpp-strings/html/structpcs_1_1_stop_slice-members.html b/documentation/structpcs_1_1_stop_slice-members.html similarity index 99% rename from cpp-strings/html/structpcs_1_1_stop_slice-members.html rename to documentation/structpcs_1_1_stop_slice-members.html index 76330c9..1587f05 100644 --- a/cpp-strings/html/structpcs_1_1_stop_slice-members.html +++ b/documentation/structpcs_1_1_stop_slice-members.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/structpcs_1_1_stop_slice.html b/documentation/structpcs_1_1_stop_slice.html similarity index 98% rename from cpp-strings/html/structpcs_1_1_stop_slice.html rename to documentation/structpcs_1_1_stop_slice.html index 20e4e1e..5977ffe 100644 --- a/cpp-strings/html/structpcs_1_1_stop_slice.html +++ b/documentation/structpcs_1_1_stop_slice.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    @@ -93,7 +93,7 @@

    struct of slices with default stop and step values More...

    -

    #include <cppstrings.h>

    +

    #include <cppstrings.h>

    Inheritance diagram for pcs::StopSlice< IntT >:
    @@ -212,7 +212,7 @@

    cppstrings.h +
  • cppstrings.h
  • diff --git a/cpp-strings/html/structpcs_1_1_stop_slice.js b/documentation/structpcs_1_1_stop_slice.js similarity index 100% rename from cpp-strings/html/structpcs_1_1_stop_slice.js rename to documentation/structpcs_1_1_stop_slice.js diff --git a/cpp-strings/html/structpcs_1_1_stop_slice.png b/documentation/structpcs_1_1_stop_slice.png similarity index 100% rename from cpp-strings/html/structpcs_1_1_stop_slice.png rename to documentation/structpcs_1_1_stop_slice.png diff --git a/cpp-strings/html/structpcs_1_1_stop_step_slice-members.html b/documentation/structpcs_1_1_stop_step_slice-members.html similarity index 99% rename from cpp-strings/html/structpcs_1_1_stop_step_slice-members.html rename to documentation/structpcs_1_1_stop_step_slice-members.html index f6f7e57..2ffd4af 100644 --- a/cpp-strings/html/structpcs_1_1_stop_step_slice-members.html +++ b/documentation/structpcs_1_1_stop_step_slice-members.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    diff --git a/cpp-strings/html/structpcs_1_1_stop_step_slice.html b/documentation/structpcs_1_1_stop_step_slice.html similarity index 98% rename from cpp-strings/html/structpcs_1_1_stop_step_slice.html rename to documentation/structpcs_1_1_stop_step_slice.html index 29a206a..b28cb04 100644 --- a/cpp-strings/html/structpcs_1_1_stop_step_slice.html +++ b/documentation/structpcs_1_1_stop_step_slice.html @@ -26,7 +26,7 @@ -
    cpp-strings 1.0.0 +
    cpp-strings 1.0.4
    Pythonic c++ strings
    @@ -93,7 +93,7 @@

    struct of slices with default stop values More...

    -

    #include <cppstrings.h>

    +

    #include <cppstrings.h>

    Inheritance diagram for pcs::StopStepSlice< IntT >:
    @@ -216,7 +216,7 @@

    cppstrings.h +
  • cppstrings.h
  • diff --git a/cpp-strings/html/structpcs_1_1_stop_step_slice.js b/documentation/structpcs_1_1_stop_step_slice.js similarity index 100% rename from cpp-strings/html/structpcs_1_1_stop_step_slice.js rename to documentation/structpcs_1_1_stop_step_slice.js diff --git a/cpp-strings/html/structpcs_1_1_stop_step_slice.png b/documentation/structpcs_1_1_stop_step_slice.png similarity index 100% rename from cpp-strings/html/structpcs_1_1_stop_step_slice.png rename to documentation/structpcs_1_1_stop_step_slice.png diff --git a/cpp-strings/html/tabs.css b/documentation/tabs.css similarity index 100% rename from cpp-strings/html/tabs.css rename to documentation/tabs.css From b6d5e390862ae3f9d81c546fde9e91b4e9320a71 Mon Sep 17 00:00:00 2001 From: Philippe Schmouker Date: Wed, 22 Oct 2025 15:13:46 +0200 Subject: [PATCH 31/31] #243-enhance content of README.md Completed. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 68fc199..0b23e67 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,8 @@ Release 1.0 implements all Python strings API but one feature (see below). Python *slices* are implemented via c++ `operator()` as declared and defined in the templated class `pcs::CppStringT<>`. Python slices have next specific notation: `[start : stop : step]` and allow the running step by step through range [start, stop) (notice: stop is excluded from the range). Operator `(start, stop, step)` acts the same way while running through the content of pythonic c++ strings. A dedicated base class `Slice` is also provided and can be passed as argument to `operator()`. It is derived in many simpler slices classes, since Python slices may not define either `start`, `stop` or `step` which then get default values (resp. 0, *end-of-sequence*, and 1). +Notice: Python 3.14 (released by Oct. 2025) implements Template Strings (T-Strings), see [string.templatelib — Support for template string literals](https://docs.python.org/3/library/string.templatelib.html) in Python 3.14 documentation and [PEP 750](https://peps.python.org/pep-0750/) for full explanations. Meanwhile, T-strings are not implemented in CppStrings library: the templates concept is already available in c++ language. The "translation" of T-Strings into CppStrings library is then left as an (easy) exercice to the user. + ### Missing parts in Release 1.0 Python strings are based on Unicode chars. This is currently not the case for pythonic c++ strings in **cpp-strings**.