Compare commits

...

10 Commits

Author SHA1 Message Date
Peter Dimov
882c9c86c4 More detabification 2019-12-12 06:00:51 +02:00
Peter Dimov
c81d8e3990 Add <cstdio> for EOF; detabify, remove trailing whitespace 2019-12-12 05:57:51 +02:00
Andrey Semashev
75276a055d Disabled all but one OS X jobs because they are slow on Travis CI. 2019-10-22 15:11:41 +03:00
Andrey Semashev
309e6a1b31 Updated CI configs, added compilers. 2019-10-22 00:52:54 +03:00
Andrey Semashev
9eeb7f85c5 Replaced tabs with spaces. 2019-06-25 15:46:36 +03:00
Daniel Frey
62c34f51f6 Avoid confusion with the spaceship operator, fixes #59 2019-04-30 18:29:28 +02:00
Glen Fernandes
6a1917ceec Add Free Functions section heading 2019-04-29 20:12:30 -04:00
Glen Fernandes
47c9f69ffe Correct documentation URLs and update documentation 2019-04-29 18:48:51 -04:00
Glen Fernandes
7b74d2d494 Update libraries.json and documentation 2019-04-23 15:37:57 -04:00
Marshall Clow
57da5f0c18 Merge pull request #58 from boostorg/ostream_write
Refactor stream write functionality into a standalone utility
2019-04-23 03:56:04 -07:00
8 changed files with 276 additions and 93 deletions

View File

@@ -1,4 +1,5 @@
# Copyright 2016, 2017 Peter Dimov # Copyright 2016, 2017 Peter Dimov
# Copyright 2019 Andrey Semashev
# Distributed under the Boost Software License, Version 1.0. # Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) # (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@@ -24,12 +25,32 @@ matrix:
- env: BOGUS_JOB=true - env: BOGUS_JOB=true
include: include:
# gcc, Linux
- os: linux - os: linux
compiler: g++ dist: trusty
env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11 compiler: gcc-4.4
env: TOOLSET=gcc COMPILER=g++-4.4 CXXSTD=98,0x
addons:
apt:
packages:
- g++-4.4
sources:
- ubuntu-toolchain-r-test
- os: linux - os: linux
compiler: g++-4.7 dist: trusty
compiler: gcc-4.6
env: TOOLSET=gcc COMPILER=g++-4.6 CXXSTD=03,0x
addons:
apt:
packages:
- g++-4.6
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: trusty
compiler: gcc-4.7
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11 env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11
addons: addons:
apt: apt:
@@ -39,7 +60,8 @@ matrix:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- os: linux - os: linux
compiler: g++-4.8 dist: xenial
compiler: gcc-4.8
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11 env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11
addons: addons:
apt: apt:
@@ -47,8 +69,10 @@ matrix:
- g++-4.8 - g++-4.8
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- os: linux - os: linux
compiler: g++-4.9 dist: xenial
compiler: gcc-4.9
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11 env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11
addons: addons:
apt: apt:
@@ -58,7 +82,8 @@ matrix:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- os: linux - os: linux
compiler: g++-5 dist: xenial
compiler: gcc-5
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z
addons: addons:
apt: apt:
@@ -68,7 +93,8 @@ matrix:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- os: linux - os: linux
compiler: g++-6 dist: xenial
compiler: gcc-6
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z
addons: addons:
apt: apt:
@@ -78,8 +104,8 @@ matrix:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- os: linux - os: linux
dist: trusty dist: xenial
compiler: g++-7 compiler: gcc-7
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17 env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17
addons: addons:
apt: apt:
@@ -89,9 +115,9 @@ matrix:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- os: linux - os: linux
dist: trusty dist: xenial
compiler: g++-8 compiler: gcc-8
env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=03,11,14,17 env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=03,11,14,17,2a
addons: addons:
apt: apt:
packages: packages:
@@ -100,22 +126,34 @@ matrix:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- os: linux - os: linux
compiler: clang++ dist: bionic
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11 compiler: gcc-9
env: TOOLSET=gcc COMPILER=g++-9 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- g++-9
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
# clang, Linux
- os: linux - os: linux
compiler: clang++-3.5 dist: trusty
compiler: clang-3.5
env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11 env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11
addons: addons:
apt: apt:
packages: packages:
- clang-3.5 - clang-3.5
- libstdc++-4.9-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.5 - sourceline: "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.5 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux - os: linux
compiler: clang++-3.6 dist: trusty
compiler: clang-3.6
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11,14,1z env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11,14,1z
addons: addons:
apt: apt:
@@ -124,10 +162,12 @@ matrix:
- libstdc++-5-dev - libstdc++-5-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.6 - sourceline: "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.6 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux - os: linux
compiler: clang++-3.7 dist: trusty
compiler: clang-3.7
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=03,11,14,1z env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=03,11,14,1z
addons: addons:
apt: apt:
@@ -136,83 +176,149 @@ matrix:
- libstdc++-5-dev - libstdc++-5-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.7 - sourceline: "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.7 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux - os: linux
compiler: clang++-3.8 dist: xenial
compiler: clang-3.8
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z
addons: addons:
apt: apt:
packages: packages:
- clang-3.8 - clang-3.8
- libstdc++-5-dev - libstdc++-6-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8 - sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.8 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux - os: linux
compiler: clang++-3.9 dist: xenial
compiler: clang-3.9
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z
addons: addons:
apt: apt:
packages: packages:
- clang-3.9 - clang-3.9
- libstdc++-5-dev - libstdc++-6-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.9 - sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.9 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux - os: linux
compiler: clang++-4.0 dist: xenial
compiler: clang-4
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03,11,14,1z env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03,11,14,1z
addons: addons:
apt: apt:
packages: packages:
- clang-4.0 - clang-4.0
- libstdc++-5-dev - libstdc++-6-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-trusty-4.0 - sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-4.0 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux - os: linux
compiler: clang++-5.0 dist: xenial
compiler: clang-5
env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03,11,14,1z env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03,11,14,1z
addons: addons:
apt: apt:
packages: packages:
- clang-5.0 - clang-5.0
- libstdc++-5-dev - libstdc++-7-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-trusty-5.0 - sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-5.0 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux - os: linux
compiler: clang++-6.0 dist: xenial
env: TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=03,11,14,17 compiler: clang-6
env: TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=03,11,14,17,2a
addons: addons:
apt: apt:
packages: packages:
- clang-6.0 - clang-6.0
- libstdc++-5-dev - libstdc++-8-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-trusty-6.0 - sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-6.0 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux - os: linux
compiler: clang++-7 dist: xenial
env: TOOLSET=clang COMPILER=clang++-7 CXXSTD=03,11,14,17 compiler: clang-7
env: TOOLSET=clang COMPILER=clang++-7 CXXSTD=03,11,14,17,2a
addons: addons:
apt: apt:
packages: packages:
- clang-7 - clang-7
- libstdc++-5-dev - libstdc++-8-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-trusty-7 - sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-8
env: TOOLSET=clang COMPILER=clang++-8 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- clang-8
- libstdc++-8-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-9
env: TOOLSET=clang COMPILER=clang++-9 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- clang-9
- libstdc++-9-dev
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-libc++
env: TOOLSET=clang COMPILER=clang++-9 CXXSTD=03,11,14,17,2a CXXFLAGS="-stdlib=libc++" LINKFLAGS="-stdlib=libc++"
addons:
apt:
packages:
- clang-9
- libc++-9-dev
- libc++abi-9-dev
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
# clang, OS X
# OS X builds are slow on Travis CI
# - os: osx
# env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
# osx_image: xcode9.4
#
# - os: osx
# env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
# osx_image: xcode10.3
- os: osx - os: osx
compiler: clang++ env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,17
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z osx_image: xcode11.2
install: install:
- GIT_FETCH_JOBS=8 - GIT_FETCH_JOBS=8
@@ -243,7 +349,7 @@ script:
- |- - |-
echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
- BUILD_JOBS=`(nproc || sysctl -n hw.ncpu) 2> /dev/null` - BUILD_JOBS=`(nproc || sysctl -n hw.ncpu) 2> /dev/null`
- ./b2 -j $BUILD_JOBS libs/utility/test toolset=$TOOLSET cxxstd=$CXXSTD - ./b2 -j $BUILD_JOBS libs/utility/test toolset=$TOOLSET cxxstd=$CXXSTD ${CXXFLAGS:+cxxflags="$CXXFLAGS"} ${LINKFLAGS:+linkflags="$LINKFLAGS"}
notifications: notifications:
email: email:

View File

@@ -1,4 +1,5 @@
# Copyright 2016-2019 Peter Dimov # Copyright 2016-2019 Peter Dimov
# Copyright 2019 Andrey Semashev
# Distributed under the Boost Software License, Version 1.0. # Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) # (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@@ -14,15 +15,43 @@ branches:
environment: environment:
matrix: matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0
TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0 APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - TOOLSET: msvc-14.0
TOOLSET: msvc-12.0,msvc-14.0
ADDRMD: 32,64 ADDRMD: 32,64
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
TOOLSET: msvc-14.1 - TOOLSET: msvc-14.1
CXXSTD: 14,17
ADDRMD: 32,64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: msvc-14.2
ADDRMD: 32,64 ADDRMD: 32,64
CXXSTD: 14,17 CXXSTD: 14,17
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
- TOOLSET: clang-win
ADDRMD: 32,64
CXXSTD: 14,17
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\cygwin\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\cygwin64\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\mingw\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
install: install:
- set GIT_FETCH_JOBS=8 - set GIT_FETCH_JOBS=8

View File

@@ -15,7 +15,7 @@ Distributed under the Boost Software License, Version 1.0.
[section Overview] [section Overview]
The header <boost/utility/ostream_string.hpp> provides the function template The header <boost/utility/ostream_string.hpp> provides the function template
boost::ostream_string for formatted output that satisfies the requirements of `boost::ostream_string` for formatted output that satisfies the requirements of
\[ostream.formatted.reqmts\]. \[ostream.formatted.reqmts\].
[endsect] [endsect]
@@ -50,13 +50,29 @@ ostream_string(std::basic_ostream<charT, traits>& os,
} /* boost */ } /* boost */
``` ```
[heading Free functions]
[variablelist [variablelist
[[`template<class charT, class traits> std::basic_ostream<charT, traits>&
ostream_string(std::basic_ostream<charT, traits>& os, const charT* data,
std::size_t size);`]
[[variablelist
[[Effects] [[Effects]
[Behaves like a formatted inserter (as described in [Behaves like a formatted inserter (as described in
\[ostream.formatted.reqmts\]) of `os`. Creates a character sequence `seq` of \[ostream.formatted.reqmts\]) of `os`. Creates a character sequence `seq` of
`size` characters starting at `data`, each widened using `os.widen()` `size` characters starting at `data`, each widened using `os.widen()`
(\[basic.ios.members\]). Determines padding for `seq` as described in (\[basic.ios.members\]). Determines padding for `seq` as described in
\[ostream.formatted.reqmts\]. Inserts `seq` into `os`. Calls `width(0)`.]] \[ostream.formatted.reqmts\]. Inserts `seq` into `os`. Calls `width(0)`.]]
[[Returns] [`os`.]]] [[Returns][`os`.]]]]]]
[endsect]
[section History]
[heading boost 1.71]
* Glen Fernandes updated the implementation of the `basic_string_ref` and
`basic_string_view` stream insertion operators to write directly to the
`basic_streambuf` and refactored that functionality into this common utility.
[endsect] [endsect]

View File

@@ -156,6 +156,11 @@ String-like operations:
[section History] [section History]
[/===============] [/===============]
[heading boost 1.71]
* Glen Fernandes updated the implementation of the stream insertion operator to
write directly to the `basic_streambuf` and refactored that functionality into
a common utility.
[heading boost 1.53] [heading boost 1.53]
* Introduced * Introduced

View File

@@ -186,7 +186,7 @@ namespace boost {
if (pos > size()) if (pos > size())
BOOST_THROW_EXCEPTION(std::out_of_range("string_view::copy" )); BOOST_THROW_EXCEPTION(std::out_of_range("string_view::copy" ));
size_type rlen = (std::min)(n, len_ - pos); size_type rlen = (std::min)(n, len_ - pos);
traits_type::copy(s, data() + pos, rlen); traits_type::copy(s, data() + pos, rlen);
return rlen; return rlen;
} }

View File

@@ -85,6 +85,19 @@
"Daniel Frey <d.frey -at- gmx.de>" "Daniel Frey <d.frey -at- gmx.de>"
] ]
}, },
{
"key": "utility/ostream_string",
"name": "ostream_string",
"description": "String formatted output function.",
"documentation": "doc/html/ostream_string.html",
"category": [
"IO"
],
"authors": "Glen Fernandes",
"maintainers": [
"Glen Fernandes <glenjofe -at- gmail.com>"
]
},
{ {
"key": "utility/result_of", "key": "utility/result_of",
"name": "Result Of", "name": "Result Of",
@@ -98,6 +111,19 @@
"Daniel Walker <daniel.j.walker -at- gmail.com>" "Daniel Walker <daniel.j.walker -at- gmail.com>"
] ]
}, },
{
"key": "utility/string_ref",
"name": "string_ref",
"description": "String view templates.",
"documentation": "doc/html/string_ref.html",
"category": [
"Containers"
],
"authors": "Marshall Clow",
"maintainers": [
"Marshall Clow <marshall -at- idio.com>"
]
},
{ {
"key": "utility/value_initialized", "key": "utility/value_initialized",
"name": "Value Initialized", "name": "Value Initialized",

View File

@@ -119,8 +119,8 @@
also want <code>x &gt; y, x &gt;= y,</code> and <code>x &lt;= y</code>. also want <code>x &gt; y, x &gt;= y,</code> and <code>x &lt;= y</code>.
Moreover, unless your class has really surprising behavior, some of these Moreover, unless your class has really surprising behavior, some of these
related operators can be defined in terms of others (e.g. <code>x &gt;= y related operators can be defined in terms of others (e.g. <code>x &gt;= y
&lt;=&gt; !(x &lt; y)</code>). Replicating this boilerplate for multiple is equivalent to !(x &lt; y)</code>). Replicating this boilerplate for
classes is both tedious and error-prone. The <cite><a href= multiple classes is both tedious and error-prone. The <cite><a href=
"../../boost/operators.hpp">boost/operators.hpp</a></cite> templates help "../../boost/operators.hpp">boost/operators.hpp</a></cite> templates help
by generating operators for you at namespace scope based on other by generating operators for you at namespace scope based on other
operators you've defined in your class.</p> operators you've defined in your class.</p>

View File

@@ -12,6 +12,7 @@
#include <cstddef> // for NULL, std::size_t, std::ptrdiff_t #include <cstddef> // for NULL, std::size_t, std::ptrdiff_t
#include <cstring> // for std::strchr and std::strcmp #include <cstring> // for std::strchr and std::strcmp
#include <cstdlib> // for std::malloc and std::free #include <cstdlib> // for std::malloc and std::free
#include <cstdio> // for EOF
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/utility/string_view.hpp> #include <boost/utility/string_view.hpp>
@@ -19,11 +20,11 @@
#if __cplusplus >= 201402L #if __cplusplus >= 201402L
struct constexpr_char_traits struct constexpr_char_traits
{ {
typedef char char_type; typedef char char_type;
typedef int int_type; typedef int int_type;
typedef std::streamoff off_type; typedef std::streamoff off_type;
typedef std::streampos pos_type; typedef std::streampos pos_type;
typedef std::mbstate_t state_type; typedef std::mbstate_t state_type;
static void assign(char_type& c1, const char_type& c2) noexcept { c1 = c2; } static void assign(char_type& c1, const char_type& c2) noexcept { c1 = c2; }
static constexpr bool eq(char_type c1, char_type c2) noexcept { return c1 == c2; } static constexpr bool eq(char_type c1, char_type c2) noexcept { return c1 == c2; }
@@ -43,11 +44,11 @@ struct constexpr_char_traits
static constexpr int_type eof() noexcept { return EOF; } static constexpr int_type eof() noexcept { return EOF; }
}; };
// yields: // yields:
// 0 if for each i in [0,n), X::eq(s1[i],s2[i]) is true; // 0 if for each i in [0,n), X::eq(s1[i],s2[i]) is true;
// else, a negative value if, for some j in [0,n), X::lt(s1[j],s2[j]) is true and // else, a negative value if, for some j in [0,n), X::lt(s1[j],s2[j]) is true and
// for each i in [0,j) X::eq(s2[i],s2[i]) is true; // for each i in [0,j) X::eq(s2[i],s2[i]) is true;
// else a positive value. // else a positive value.
constexpr int constexpr_char_traits::compare(const char_type* s1, const char_type* s2, size_t n) noexcept constexpr int constexpr_char_traits::compare(const char_type* s1, const char_type* s2, size_t n) noexcept
{ {
for (; n != 0; --n, ++s1, ++s2) for (; n != 0; --n, ++s1, ++s2)
@@ -77,38 +78,38 @@ int main()
constexpr string_view sv2{"abc", 3}; // ptr, len constexpr string_view sv2{"abc", 3}; // ptr, len
constexpr string_view sv3{"def"}; // ptr constexpr string_view sv3{"def"}; // ptr
constexpr const char *s1 = ""; constexpr const char *s1 = "";
constexpr const char *s2 = "abc"; constexpr const char *s2 = "abc";
static_assert( (sv1 == sv1), "" );
static_assert(!(sv1 == sv2), "" );
static_assert( (sv1 != sv2), "" );
static_assert( (sv1 < sv2), "" );
static_assert( (sv1 <= sv2), "" );
static_assert(!(sv1 > sv2), "" );
static_assert(!(sv1 >= sv2), "" );
static_assert(!(s1 == sv2), "" ); static_assert( (sv1 == sv1), "" );
static_assert( (s1 != sv2), "" );
static_assert( (s1 < sv2), "" );
static_assert( (s1 <= sv2), "" );
static_assert(!(s1 > sv2), "" );
static_assert(!(s1 >= sv2), "" );
static_assert(!(sv1 == s2), "" ); static_assert(!(sv1 == sv2), "" );
static_assert( (sv1 != s2), "" ); static_assert( (sv1 != sv2), "" );
static_assert( (sv1 < s2), "" ); static_assert( (sv1 < sv2), "" );
static_assert( (sv1 <= s2), "" ); static_assert( (sv1 <= sv2), "" );
static_assert(!(sv1 > s2), "" ); static_assert(!(sv1 > sv2), "" );
static_assert(!(sv1 >= s2), "" ); static_assert(!(sv1 >= sv2), "" );
static_assert( sv1.compare(sv2) < 0, "" ); static_assert(!(s1 == sv2), "" );
static_assert( sv1.compare(sv1) == 0, "" ); static_assert( (s1 != sv2), "" );
static_assert( sv3.compare(sv1) > 0, "" ); static_assert( (s1 < sv2), "" );
static_assert( (s1 <= sv2), "" );
static_assert(!(s1 > sv2), "" );
static_assert(!(s1 >= sv2), "" );
static_assert( sv1.compare(s2) < 0, "" ); static_assert(!(sv1 == s2), "" );
static_assert( sv1.compare(s1) == 0, "" ); static_assert( (sv1 != s2), "" );
static_assert( sv3.compare(s1) > 0, "" ); static_assert( (sv1 < s2), "" );
static_assert( (sv1 <= s2), "" );
static_assert(!(sv1 > s2), "" );
static_assert(!(sv1 >= s2), "" );
static_assert( sv1.compare(sv2) < 0, "" );
static_assert( sv1.compare(sv1) == 0, "" );
static_assert( sv3.compare(sv1) > 0, "" );
static_assert( sv1.compare(s2) < 0, "" );
static_assert( sv1.compare(s1) == 0, "" );
static_assert( sv3.compare(s1) > 0, "" );
} }
#endif #endif