mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
dda83cd783
Many spots incorrectly use only spaces for indentation (for example, there are a lot of spots in ada-lang.c). I've always found it awkward when I needed to edit one of these spots: do I keep the original wrong indentation, or do I fix it? What if the lines around it are also wrong, do I fix them too? I probably don't want to fix them in the same patch, to avoid adding noise to my patch. So I propose to fix as much as possible once and for all (hopefully). One typical counter argument for this is that it makes code archeology more difficult, because git-blame will show this commit as the last change for these lines. My counter counter argument is: when git-blaming, you often need to do "blame the file at the parent commit" anyway, to go past some other refactor that touched the line you are interested in, but is not the change you are looking for. So you already need a somewhat efficient way to do this. Using some interactive tool, rather than plain git-blame, makes this trivial. For example, I use "tig blame <file>", where going back past the commit that changed the currently selected line is one keystroke. It looks like Magit in Emacs does it too (though I've never used it). Web viewers of Github and Gitlab do it too. My point is that it won't really make archeology more difficult. The other typical counter argument is that it will cause conflicts with existing patches. That's true... but it's a one time cost, and those are not conflicts that are difficult to resolve. I have also tried "git rebase --ignore-whitespace", it seems to work well. Although that will re-introduce the faulty indentation, so one needs to take care of fixing the indentation in the patch after that (which is easy). gdb/ChangeLog: * aarch64-linux-tdep.c: Fix indentation. * aarch64-ravenscar-thread.c: Fix indentation. * aarch64-tdep.c: Fix indentation. * aarch64-tdep.h: Fix indentation. * ada-lang.c: Fix indentation. * ada-lang.h: Fix indentation. * ada-tasks.c: Fix indentation. * ada-typeprint.c: Fix indentation. * ada-valprint.c: Fix indentation. * ada-varobj.c: Fix indentation. * addrmap.c: Fix indentation. * addrmap.h: Fix indentation. * agent.c: Fix indentation. * aix-thread.c: Fix indentation. * alpha-bsd-nat.c: Fix indentation. * alpha-linux-tdep.c: Fix indentation. * alpha-mdebug-tdep.c: Fix indentation. * alpha-nbsd-tdep.c: Fix indentation. * alpha-obsd-tdep.c: Fix indentation. * alpha-tdep.c: Fix indentation. * amd64-bsd-nat.c: Fix indentation. * amd64-darwin-tdep.c: Fix indentation. * amd64-linux-nat.c: Fix indentation. * amd64-linux-tdep.c: Fix indentation. * amd64-nat.c: Fix indentation. * amd64-obsd-tdep.c: Fix indentation. * amd64-tdep.c: Fix indentation. * amd64-windows-tdep.c: Fix indentation. * annotate.c: Fix indentation. * arc-tdep.c: Fix indentation. * arch-utils.c: Fix indentation. * arch/arm-get-next-pcs.c: Fix indentation. * arch/arm.c: Fix indentation. * arm-linux-nat.c: Fix indentation. * arm-linux-tdep.c: Fix indentation. * arm-nbsd-tdep.c: Fix indentation. * arm-pikeos-tdep.c: Fix indentation. * arm-tdep.c: Fix indentation. * arm-tdep.h: Fix indentation. * arm-wince-tdep.c: Fix indentation. * auto-load.c: Fix indentation. * auxv.c: Fix indentation. * avr-tdep.c: Fix indentation. * ax-gdb.c: Fix indentation. * ax-general.c: Fix indentation. * bfin-linux-tdep.c: Fix indentation. * block.c: Fix indentation. * block.h: Fix indentation. * blockframe.c: Fix indentation. * bpf-tdep.c: Fix indentation. * break-catch-sig.c: Fix indentation. * break-catch-syscall.c: Fix indentation. * break-catch-throw.c: Fix indentation. * breakpoint.c: Fix indentation. * breakpoint.h: Fix indentation. * bsd-uthread.c: Fix indentation. * btrace.c: Fix indentation. * build-id.c: Fix indentation. * buildsym-legacy.h: Fix indentation. * buildsym.c: Fix indentation. * c-typeprint.c: Fix indentation. * c-valprint.c: Fix indentation. * c-varobj.c: Fix indentation. * charset.c: Fix indentation. * cli/cli-cmds.c: Fix indentation. * cli/cli-decode.c: Fix indentation. * cli/cli-decode.h: Fix indentation. * cli/cli-script.c: Fix indentation. * cli/cli-setshow.c: Fix indentation. * coff-pe-read.c: Fix indentation. * coffread.c: Fix indentation. * compile/compile-cplus-types.c: Fix indentation. * compile/compile-object-load.c: Fix indentation. * compile/compile-object-run.c: Fix indentation. * completer.c: Fix indentation. * corefile.c: Fix indentation. * corelow.c: Fix indentation. * cp-abi.h: Fix indentation. * cp-namespace.c: Fix indentation. * cp-support.c: Fix indentation. * cp-valprint.c: Fix indentation. * cris-linux-tdep.c: Fix indentation. * cris-tdep.c: Fix indentation. * darwin-nat-info.c: Fix indentation. * darwin-nat.c: Fix indentation. * darwin-nat.h: Fix indentation. * dbxread.c: Fix indentation. * dcache.c: Fix indentation. * disasm.c: Fix indentation. * dtrace-probe.c: Fix indentation. * dwarf2/abbrev.c: Fix indentation. * dwarf2/attribute.c: Fix indentation. * dwarf2/expr.c: Fix indentation. * dwarf2/frame.c: Fix indentation. * dwarf2/index-cache.c: Fix indentation. * dwarf2/index-write.c: Fix indentation. * dwarf2/line-header.c: Fix indentation. * dwarf2/loc.c: Fix indentation. * dwarf2/macro.c: Fix indentation. * dwarf2/read.c: Fix indentation. * dwarf2/read.h: Fix indentation. * elfread.c: Fix indentation. * eval.c: Fix indentation. * event-top.c: Fix indentation. * exec.c: Fix indentation. * exec.h: Fix indentation. * expprint.c: Fix indentation. * f-lang.c: Fix indentation. * f-typeprint.c: Fix indentation. * f-valprint.c: Fix indentation. * fbsd-nat.c: Fix indentation. * fbsd-tdep.c: Fix indentation. * findvar.c: Fix indentation. * fork-child.c: Fix indentation. * frame-unwind.c: Fix indentation. * frame-unwind.h: Fix indentation. * frame.c: Fix indentation. * frv-linux-tdep.c: Fix indentation. * frv-tdep.c: Fix indentation. * frv-tdep.h: Fix indentation. * ft32-tdep.c: Fix indentation. * gcore.c: Fix indentation. * gdb_bfd.c: Fix indentation. * gdbarch.sh: Fix indentation. * gdbarch.c: Re-generate * gdbarch.h: Re-generate. * gdbcore.h: Fix indentation. * gdbthread.h: Fix indentation. * gdbtypes.c: Fix indentation. * gdbtypes.h: Fix indentation. * glibc-tdep.c: Fix indentation. * gnu-nat.c: Fix indentation. * gnu-nat.h: Fix indentation. * gnu-v2-abi.c: Fix indentation. * gnu-v3-abi.c: Fix indentation. * go32-nat.c: Fix indentation. * guile/guile-internal.h: Fix indentation. * guile/scm-cmd.c: Fix indentation. * guile/scm-frame.c: Fix indentation. * guile/scm-iterator.c: Fix indentation. * guile/scm-math.c: Fix indentation. * guile/scm-ports.c: Fix indentation. * guile/scm-pretty-print.c: Fix indentation. * guile/scm-value.c: Fix indentation. * h8300-tdep.c: Fix indentation. * hppa-linux-nat.c: Fix indentation. * hppa-linux-tdep.c: Fix indentation. * hppa-nbsd-nat.c: Fix indentation. * hppa-nbsd-tdep.c: Fix indentation. * hppa-obsd-nat.c: Fix indentation. * hppa-tdep.c: Fix indentation. * hppa-tdep.h: Fix indentation. * i386-bsd-nat.c: Fix indentation. * i386-darwin-nat.c: Fix indentation. * i386-darwin-tdep.c: Fix indentation. * i386-dicos-tdep.c: Fix indentation. * i386-gnu-nat.c: Fix indentation. * i386-linux-nat.c: Fix indentation. * i386-linux-tdep.c: Fix indentation. * i386-nto-tdep.c: Fix indentation. * i386-obsd-tdep.c: Fix indentation. * i386-sol2-nat.c: Fix indentation. * i386-tdep.c: Fix indentation. * i386-tdep.h: Fix indentation. * i386-windows-tdep.c: Fix indentation. * i387-tdep.c: Fix indentation. * i387-tdep.h: Fix indentation. * ia64-libunwind-tdep.c: Fix indentation. * ia64-libunwind-tdep.h: Fix indentation. * ia64-linux-nat.c: Fix indentation. * ia64-linux-tdep.c: Fix indentation. * ia64-tdep.c: Fix indentation. * ia64-tdep.h: Fix indentation. * ia64-vms-tdep.c: Fix indentation. * infcall.c: Fix indentation. * infcmd.c: Fix indentation. * inferior.c: Fix indentation. * infrun.c: Fix indentation. * iq2000-tdep.c: Fix indentation. * language.c: Fix indentation. * linespec.c: Fix indentation. * linux-fork.c: Fix indentation. * linux-nat.c: Fix indentation. * linux-tdep.c: Fix indentation. * linux-thread-db.c: Fix indentation. * lm32-tdep.c: Fix indentation. * m2-lang.c: Fix indentation. * m2-typeprint.c: Fix indentation. * m2-valprint.c: Fix indentation. * m32c-tdep.c: Fix indentation. * m32r-linux-tdep.c: Fix indentation. * m32r-tdep.c: Fix indentation. * m68hc11-tdep.c: Fix indentation. * m68k-bsd-nat.c: Fix indentation. * m68k-linux-nat.c: Fix indentation. * m68k-linux-tdep.c: Fix indentation. * m68k-tdep.c: Fix indentation. * machoread.c: Fix indentation. * macrocmd.c: Fix indentation. * macroexp.c: Fix indentation. * macroscope.c: Fix indentation. * macrotab.c: Fix indentation. * macrotab.h: Fix indentation. * main.c: Fix indentation. * mdebugread.c: Fix indentation. * mep-tdep.c: Fix indentation. * mi/mi-cmd-catch.c: Fix indentation. * mi/mi-cmd-disas.c: Fix indentation. * mi/mi-cmd-env.c: Fix indentation. * mi/mi-cmd-stack.c: Fix indentation. * mi/mi-cmd-var.c: Fix indentation. * mi/mi-cmds.c: Fix indentation. * mi/mi-main.c: Fix indentation. * mi/mi-parse.c: Fix indentation. * microblaze-tdep.c: Fix indentation. * minidebug.c: Fix indentation. * minsyms.c: Fix indentation. * mips-linux-nat.c: Fix indentation. * mips-linux-tdep.c: Fix indentation. * mips-nbsd-tdep.c: Fix indentation. * mips-tdep.c: Fix indentation. * mn10300-linux-tdep.c: Fix indentation. * mn10300-tdep.c: Fix indentation. * moxie-tdep.c: Fix indentation. * msp430-tdep.c: Fix indentation. * namespace.h: Fix indentation. * nat/fork-inferior.c: Fix indentation. * nat/gdb_ptrace.h: Fix indentation. * nat/linux-namespaces.c: Fix indentation. * nat/linux-osdata.c: Fix indentation. * nat/netbsd-nat.c: Fix indentation. * nat/x86-dregs.c: Fix indentation. * nbsd-nat.c: Fix indentation. * nbsd-tdep.c: Fix indentation. * nios2-linux-tdep.c: Fix indentation. * nios2-tdep.c: Fix indentation. * nto-procfs.c: Fix indentation. * nto-tdep.c: Fix indentation. * objfiles.c: Fix indentation. * objfiles.h: Fix indentation. * opencl-lang.c: Fix indentation. * or1k-tdep.c: Fix indentation. * osabi.c: Fix indentation. * osabi.h: Fix indentation. * osdata.c: Fix indentation. * p-lang.c: Fix indentation. * p-typeprint.c: Fix indentation. * p-valprint.c: Fix indentation. * parse.c: Fix indentation. * ppc-linux-nat.c: Fix indentation. * ppc-linux-tdep.c: Fix indentation. * ppc-nbsd-nat.c: Fix indentation. * ppc-nbsd-tdep.c: Fix indentation. * ppc-obsd-nat.c: Fix indentation. * ppc-ravenscar-thread.c: Fix indentation. * ppc-sysv-tdep.c: Fix indentation. * ppc64-tdep.c: Fix indentation. * printcmd.c: Fix indentation. * proc-api.c: Fix indentation. * producer.c: Fix indentation. * producer.h: Fix indentation. * prologue-value.c: Fix indentation. * prologue-value.h: Fix indentation. * psymtab.c: Fix indentation. * python/py-arch.c: Fix indentation. * python/py-bpevent.c: Fix indentation. * python/py-event.c: Fix indentation. * python/py-event.h: Fix indentation. * python/py-finishbreakpoint.c: Fix indentation. * python/py-frame.c: Fix indentation. * python/py-framefilter.c: Fix indentation. * python/py-inferior.c: Fix indentation. * python/py-infthread.c: Fix indentation. * python/py-objfile.c: Fix indentation. * python/py-prettyprint.c: Fix indentation. * python/py-registers.c: Fix indentation. * python/py-signalevent.c: Fix indentation. * python/py-stopevent.c: Fix indentation. * python/py-stopevent.h: Fix indentation. * python/py-threadevent.c: Fix indentation. * python/py-tui.c: Fix indentation. * python/py-unwind.c: Fix indentation. * python/py-value.c: Fix indentation. * python/py-xmethods.c: Fix indentation. * python/python-internal.h: Fix indentation. * python/python.c: Fix indentation. * ravenscar-thread.c: Fix indentation. * record-btrace.c: Fix indentation. * record-full.c: Fix indentation. * record.c: Fix indentation. * reggroups.c: Fix indentation. * regset.h: Fix indentation. * remote-fileio.c: Fix indentation. * remote.c: Fix indentation. * reverse.c: Fix indentation. * riscv-linux-tdep.c: Fix indentation. * riscv-ravenscar-thread.c: Fix indentation. * riscv-tdep.c: Fix indentation. * rl78-tdep.c: Fix indentation. * rs6000-aix-tdep.c: Fix indentation. * rs6000-lynx178-tdep.c: Fix indentation. * rs6000-nat.c: Fix indentation. * rs6000-tdep.c: Fix indentation. * rust-lang.c: Fix indentation. * rx-tdep.c: Fix indentation. * s12z-tdep.c: Fix indentation. * s390-linux-tdep.c: Fix indentation. * score-tdep.c: Fix indentation. * ser-base.c: Fix indentation. * ser-mingw.c: Fix indentation. * ser-uds.c: Fix indentation. * ser-unix.c: Fix indentation. * serial.c: Fix indentation. * sh-linux-tdep.c: Fix indentation. * sh-nbsd-tdep.c: Fix indentation. * sh-tdep.c: Fix indentation. * skip.c: Fix indentation. * sol-thread.c: Fix indentation. * solib-aix.c: Fix indentation. * solib-darwin.c: Fix indentation. * solib-frv.c: Fix indentation. * solib-svr4.c: Fix indentation. * solib.c: Fix indentation. * source.c: Fix indentation. * sparc-linux-tdep.c: Fix indentation. * sparc-nbsd-tdep.c: Fix indentation. * sparc-obsd-tdep.c: Fix indentation. * sparc-ravenscar-thread.c: Fix indentation. * sparc-tdep.c: Fix indentation. * sparc64-linux-tdep.c: Fix indentation. * sparc64-nbsd-tdep.c: Fix indentation. * sparc64-obsd-tdep.c: Fix indentation. * sparc64-tdep.c: Fix indentation. * stabsread.c: Fix indentation. * stack.c: Fix indentation. * stap-probe.c: Fix indentation. * stubs/ia64vms-stub.c: Fix indentation. * stubs/m32r-stub.c: Fix indentation. * stubs/m68k-stub.c: Fix indentation. * stubs/sh-stub.c: Fix indentation. * stubs/sparc-stub.c: Fix indentation. * symfile-mem.c: Fix indentation. * symfile.c: Fix indentation. * symfile.h: Fix indentation. * symmisc.c: Fix indentation. * symtab.c: Fix indentation. * symtab.h: Fix indentation. * target-float.c: Fix indentation. * target.c: Fix indentation. * target.h: Fix indentation. * tic6x-tdep.c: Fix indentation. * tilegx-linux-tdep.c: Fix indentation. * tilegx-tdep.c: Fix indentation. * top.c: Fix indentation. * tracefile-tfile.c: Fix indentation. * tracepoint.c: Fix indentation. * tui/tui-disasm.c: Fix indentation. * tui/tui-io.c: Fix indentation. * tui/tui-regs.c: Fix indentation. * tui/tui-stack.c: Fix indentation. * tui/tui-win.c: Fix indentation. * tui/tui-winsource.c: Fix indentation. * tui/tui.c: Fix indentation. * typeprint.c: Fix indentation. * ui-out.h: Fix indentation. * unittests/copy_bitwise-selftests.c: Fix indentation. * unittests/memory-map-selftests.c: Fix indentation. * utils.c: Fix indentation. * v850-tdep.c: Fix indentation. * valarith.c: Fix indentation. * valops.c: Fix indentation. * valprint.c: Fix indentation. * valprint.h: Fix indentation. * value.c: Fix indentation. * value.h: Fix indentation. * varobj.c: Fix indentation. * vax-tdep.c: Fix indentation. * windows-nat.c: Fix indentation. * windows-tdep.c: Fix indentation. * xcoffread.c: Fix indentation. * xml-syscall.c: Fix indentation. * xml-tdesc.c: Fix indentation. * xstormy16-tdep.c: Fix indentation. * xtensa-config.c: Fix indentation. * xtensa-linux-nat.c: Fix indentation. * xtensa-linux-tdep.c: Fix indentation. * xtensa-tdep.c: Fix indentation. gdbserver/ChangeLog: * ax.cc: Fix indentation. * dll.cc: Fix indentation. * inferiors.h: Fix indentation. * linux-low.cc: Fix indentation. * linux-nios2-low.cc: Fix indentation. * linux-ppc-ipa.cc: Fix indentation. * linux-ppc-low.cc: Fix indentation. * linux-x86-low.cc: Fix indentation. * linux-xtensa-low.cc: Fix indentation. * regcache.cc: Fix indentation. * server.cc: Fix indentation. * tracepoint.cc: Fix indentation. gdbsupport/ChangeLog: * common-exceptions.h: Fix indentation. * event-loop.cc: Fix indentation. * fileio.cc: Fix indentation. * filestuff.cc: Fix indentation. * gdb-dlfcn.cc: Fix indentation. * gdb_string_view.h: Fix indentation. * job-control.cc: Fix indentation. * signals.cc: Fix indentation. Change-Id: I4bad7ae6be0fbe14168b8ebafb98ffe14964a695
567 lines
18 KiB
C++
567 lines
18 KiB
C++
// Components for manipulating non-owning sequences of characters -*- C++ -*-
|
|
|
|
|
|
#ifndef COMMON_GDB_STRING_VIEW_H
|
|
#define COMMON_GDB_STRING_VIEW_H
|
|
|
|
// Note: This file has been stolen from the gcc repo
|
|
// (libstdc++-v3/include/experimental/string_view) and has local modifications.
|
|
|
|
// Copyright (C) 2013-2020 Free Software Foundation, Inc.
|
|
//
|
|
// This file is part of the GNU ISO C++ Library. This library 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, or (at your option)
|
|
// any later version.
|
|
|
|
// This library 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.
|
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
// You should have received a copy of the GNU General Public License and
|
|
// a copy of the GCC Runtime Library Exception along with this program;
|
|
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
//
|
|
// N3762 basic_string_view library
|
|
//
|
|
|
|
|
|
#if __cplusplus >= 201703L
|
|
|
|
#include <string_view>
|
|
|
|
namespace gdb {
|
|
using string_view = std::string_view;
|
|
} /* namespace gdb */
|
|
|
|
#else /* __cplusplus < 201703L */
|
|
|
|
#include <string>
|
|
#include <limits>
|
|
#include "gdb_assert.h"
|
|
|
|
namespace gdb {
|
|
|
|
/**
|
|
* @class basic_string_view <experimental/string_view>
|
|
* @brief A non-owning reference to a string.
|
|
*
|
|
* @ingroup strings
|
|
* @ingroup sequences
|
|
* @ingroup experimental
|
|
*
|
|
* @tparam _CharT Type of character
|
|
* @tparam _Traits Traits for character type, defaults to
|
|
* char_traits<_CharT>.
|
|
*
|
|
* A basic_string_view looks like this:
|
|
*
|
|
* @code
|
|
* _CharT* _M_str
|
|
* size_t _M_len
|
|
* @endcode
|
|
*/
|
|
template<typename _CharT, typename _Traits = std::char_traits<_CharT>>
|
|
class basic_string_view
|
|
{
|
|
public:
|
|
|
|
// types
|
|
using traits_type = _Traits;
|
|
using value_type = _CharT;
|
|
using pointer = const _CharT*;
|
|
using const_pointer = const _CharT*;
|
|
using reference = const _CharT&;
|
|
using const_reference = const _CharT&;
|
|
using const_iterator = const _CharT*;
|
|
using iterator = const_iterator;
|
|
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
|
using reverse_iterator = const_reverse_iterator;
|
|
using size_type = size_t;
|
|
using difference_type = ptrdiff_t;
|
|
static constexpr size_type npos = size_type(-1);
|
|
|
|
// [string.view.cons], construct/copy
|
|
|
|
constexpr
|
|
basic_string_view() noexcept
|
|
: _M_len{0}, _M_str{nullptr}
|
|
{ }
|
|
|
|
constexpr basic_string_view(const basic_string_view&) noexcept = default;
|
|
|
|
template<typename _Allocator>
|
|
basic_string_view(const std::basic_string<_CharT, _Traits,
|
|
_Allocator>& __str) noexcept
|
|
: _M_len{__str.length()}, _M_str{__str.data()}
|
|
{ }
|
|
|
|
/*constexpr*/ basic_string_view(const _CharT* __str)
|
|
: _M_len{__str == nullptr ? 0 : traits_type::length(__str)},
|
|
_M_str{__str}
|
|
{ }
|
|
|
|
constexpr basic_string_view(const _CharT* __str, size_type __len)
|
|
: _M_len{__len},
|
|
_M_str{__str}
|
|
{ }
|
|
|
|
basic_string_view&
|
|
operator=(const basic_string_view&) noexcept = default;
|
|
|
|
// [string.view.iterators], iterators
|
|
|
|
constexpr const_iterator
|
|
begin() const noexcept
|
|
{ return this->_M_str; }
|
|
|
|
constexpr const_iterator
|
|
end() const noexcept
|
|
{ return this->_M_str + this->_M_len; }
|
|
|
|
constexpr const_iterator
|
|
cbegin() const noexcept
|
|
{ return this->_M_str; }
|
|
|
|
constexpr const_iterator
|
|
cend() const noexcept
|
|
{ return this->_M_str + this->_M_len; }
|
|
|
|
const_reverse_iterator
|
|
rbegin() const noexcept
|
|
{ return const_reverse_iterator(this->end()); }
|
|
|
|
const_reverse_iterator
|
|
rend() const noexcept
|
|
{ return const_reverse_iterator(this->begin()); }
|
|
|
|
const_reverse_iterator
|
|
crbegin() const noexcept
|
|
{ return const_reverse_iterator(this->end()); }
|
|
|
|
const_reverse_iterator
|
|
crend() const noexcept
|
|
{ return const_reverse_iterator(this->begin()); }
|
|
|
|
// [string.view.capacity], capacity
|
|
|
|
constexpr size_type
|
|
size() const noexcept
|
|
{ return this->_M_len; }
|
|
|
|
constexpr size_type
|
|
length() const noexcept
|
|
{ return _M_len; }
|
|
|
|
constexpr size_type
|
|
max_size() const noexcept
|
|
{
|
|
return (npos - sizeof(size_type) - sizeof(void*))
|
|
/ sizeof(value_type) / 4;
|
|
}
|
|
|
|
constexpr bool
|
|
empty() const noexcept
|
|
{ return this->_M_len == 0; }
|
|
|
|
// [string.view.access], element access
|
|
|
|
constexpr const _CharT&
|
|
operator[](size_type __pos) const
|
|
{
|
|
// TODO: Assert to restore in a way compatible with the constexpr.
|
|
// __glibcxx_assert(__pos < this->_M_len);
|
|
return *(this->_M_str + __pos);
|
|
}
|
|
|
|
constexpr const _CharT&
|
|
at(size_type __pos) const
|
|
{
|
|
return __pos < this->_M_len
|
|
? *(this->_M_str + __pos)
|
|
: (error (_("basic_string_view::at: __pos "
|
|
"(which is %zu) >= this->size() "
|
|
"(which is %zu)"),
|
|
__pos, this->size()),
|
|
*this->_M_str);
|
|
}
|
|
|
|
constexpr const _CharT&
|
|
front() const
|
|
{
|
|
// TODO: Assert to restore in a way compatible with the constexpr.
|
|
// __glibcxx_assert(this->_M_len > 0);
|
|
return *this->_M_str;
|
|
}
|
|
|
|
constexpr const _CharT&
|
|
back() const
|
|
{
|
|
// TODO: Assert to restore in a way compatible with the constexpr.
|
|
// __glibcxx_assert(this->_M_len > 0);
|
|
return *(this->_M_str + this->_M_len - 1);
|
|
}
|
|
|
|
constexpr const _CharT*
|
|
data() const noexcept
|
|
{ return this->_M_str; }
|
|
|
|
// [string.view.modifiers], modifiers:
|
|
|
|
/*constexpr*/ void
|
|
remove_prefix(size_type __n)
|
|
{
|
|
gdb_assert (this->_M_len >= __n);
|
|
this->_M_str += __n;
|
|
this->_M_len -= __n;
|
|
}
|
|
|
|
/*constexpr*/ void
|
|
remove_suffix(size_type __n)
|
|
{ this->_M_len -= __n; }
|
|
|
|
/*constexpr*/ void
|
|
swap(basic_string_view& __sv) noexcept
|
|
{
|
|
auto __tmp = *this;
|
|
*this = __sv;
|
|
__sv = __tmp;
|
|
}
|
|
|
|
|
|
// [string.view.ops], string operations:
|
|
|
|
template<typename _Allocator>
|
|
explicit operator std::basic_string<_CharT, _Traits, _Allocator>() const
|
|
{
|
|
return { this->_M_str, this->_M_len };
|
|
}
|
|
|
|
size_type
|
|
copy(_CharT* __str, size_type __n, size_type __pos = 0) const
|
|
{
|
|
gdb_assert (__str != nullptr || __n == 0);
|
|
if (__pos > this->_M_len)
|
|
error (_("basic_string_view::copy: __pos "
|
|
"(which is %zu) > this->size() "
|
|
"(which is %zu)"),
|
|
__pos, this->size());
|
|
size_type __rlen{std::min(__n, size_type{this->_M_len - __pos})};
|
|
for (auto __begin = this->_M_str + __pos,
|
|
__end = __begin + __rlen; __begin != __end;)
|
|
*__str++ = *__begin++;
|
|
return __rlen;
|
|
}
|
|
|
|
|
|
// [string.view.ops], string operations:
|
|
|
|
/*constexpr*/ basic_string_view
|
|
substr(size_type __pos, size_type __n=npos) const
|
|
{
|
|
return __pos <= this->_M_len
|
|
? basic_string_view{this->_M_str + __pos,
|
|
std::min(__n, size_type{this->_M_len - __pos})}
|
|
: (error (_("basic_string_view::substr: __pos "
|
|
"(which is %zu) > this->size() "
|
|
"(which is %zu)"),
|
|
__pos, this->size()), basic_string_view{});
|
|
}
|
|
|
|
/*constexpr*/ int
|
|
compare(basic_string_view __str) const noexcept
|
|
{
|
|
int __ret = traits_type::compare(this->_M_str, __str._M_str,
|
|
std::min(this->_M_len, __str._M_len));
|
|
if (__ret == 0)
|
|
__ret = _S_compare(this->_M_len, __str._M_len);
|
|
return __ret;
|
|
}
|
|
|
|
/*constexpr*/ int
|
|
compare(size_type __pos1, size_type __n1, basic_string_view __str) const
|
|
{ return this->substr(__pos1, __n1).compare(__str); }
|
|
|
|
/*constexpr*/ int
|
|
compare(size_type __pos1, size_type __n1,
|
|
basic_string_view __str, size_type __pos2, size_type __n2) const
|
|
{ return this->substr(__pos1, __n1).compare(__str.substr(__pos2, __n2)); }
|
|
|
|
/*constexpr*/ int
|
|
compare(const _CharT* __str) const noexcept
|
|
{ return this->compare(basic_string_view{__str}); }
|
|
|
|
/*constexpr*/ int
|
|
compare(size_type __pos1, size_type __n1, const _CharT* __str) const
|
|
{ return this->substr(__pos1, __n1).compare(basic_string_view{__str}); }
|
|
|
|
/*constexpr*/ int
|
|
compare(size_type __pos1, size_type __n1,
|
|
const _CharT* __str, size_type __n2) const
|
|
{
|
|
return this->substr(__pos1, __n1)
|
|
.compare(basic_string_view(__str, __n2));
|
|
}
|
|
|
|
/*constexpr*/ size_type
|
|
find(basic_string_view __str, size_type __pos = 0) const noexcept
|
|
{ return this->find(__str._M_str, __pos, __str._M_len); }
|
|
|
|
/*constexpr*/ size_type
|
|
find(_CharT __c, size_type __pos=0) const noexcept;
|
|
|
|
/*constexpr*/ size_type
|
|
find(const _CharT* __str, size_type __pos, size_type __n) const noexcept;
|
|
|
|
/*constexpr*/ size_type
|
|
find(const _CharT* __str, size_type __pos=0) const noexcept
|
|
{ return this->find(__str, __pos, traits_type::length(__str)); }
|
|
|
|
/*constexpr*/ size_type
|
|
rfind(basic_string_view __str, size_type __pos = npos) const noexcept
|
|
{ return this->rfind(__str._M_str, __pos, __str._M_len); }
|
|
|
|
/*constexpr*/ size_type
|
|
rfind(_CharT __c, size_type __pos = npos) const noexcept;
|
|
|
|
/*constexpr*/ size_type
|
|
rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept;
|
|
|
|
/*constexpr*/ size_type
|
|
rfind(const _CharT* __str, size_type __pos = npos) const noexcept
|
|
{ return this->rfind(__str, __pos, traits_type::length(__str)); }
|
|
|
|
/*constexpr*/ size_type
|
|
find_first_of(basic_string_view __str, size_type __pos = 0) const noexcept
|
|
{ return this->find_first_of(__str._M_str, __pos, __str._M_len); }
|
|
|
|
/*constexpr*/ size_type
|
|
find_first_of(_CharT __c, size_type __pos = 0) const noexcept
|
|
{ return this->find(__c, __pos); }
|
|
|
|
/*constexpr*/ size_type
|
|
find_first_of(const _CharT* __str, size_type __pos, size_type __n) const;
|
|
|
|
/*constexpr*/ size_type
|
|
find_first_of(const _CharT* __str, size_type __pos = 0) const noexcept
|
|
{ return this->find_first_of(__str, __pos, traits_type::length(__str)); }
|
|
|
|
/*constexpr*/ size_type
|
|
find_last_of(basic_string_view __str,
|
|
size_type __pos = npos) const noexcept
|
|
{ return this->find_last_of(__str._M_str, __pos, __str._M_len); }
|
|
|
|
size_type
|
|
find_last_of(_CharT __c, size_type __pos=npos) const noexcept
|
|
{ return this->rfind(__c, __pos); }
|
|
|
|
/*constexpr*/ size_type
|
|
find_last_of(const _CharT* __str, size_type __pos, size_type __n) const;
|
|
|
|
/*constexpr*/ size_type
|
|
find_last_of(const _CharT* __str, size_type __pos = npos) const noexcept
|
|
{ return this->find_last_of(__str, __pos, traits_type::length(__str)); }
|
|
|
|
/*constexpr*/ size_type
|
|
find_first_not_of(basic_string_view __str,
|
|
size_type __pos = 0) const noexcept
|
|
{ return this->find_first_not_of(__str._M_str, __pos, __str._M_len); }
|
|
|
|
/*constexpr*/ size_type
|
|
find_first_not_of(_CharT __c, size_type __pos = 0) const noexcept;
|
|
|
|
/*constexpr*/ size_type
|
|
find_first_not_of(const _CharT* __str,
|
|
size_type __pos, size_type __n) const;
|
|
|
|
/*constexpr*/ size_type
|
|
find_first_not_of(const _CharT* __str, size_type __pos = 0) const noexcept
|
|
{
|
|
return this->find_first_not_of(__str, __pos,
|
|
traits_type::length(__str));
|
|
}
|
|
|
|
/*constexpr*/ size_type
|
|
find_last_not_of(basic_string_view __str,
|
|
size_type __pos = npos) const noexcept
|
|
{ return this->find_last_not_of(__str._M_str, __pos, __str._M_len); }
|
|
|
|
/*constexpr*/ size_type
|
|
find_last_not_of(_CharT __c, size_type __pos = npos) const noexcept;
|
|
|
|
/*constexpr*/ size_type
|
|
find_last_not_of(const _CharT* __str,
|
|
size_type __pos, size_type __n) const;
|
|
|
|
/*constexpr*/ size_type
|
|
find_last_not_of(const _CharT* __str,
|
|
size_type __pos = npos) const noexcept
|
|
{
|
|
return this->find_last_not_of(__str, __pos,
|
|
traits_type::length(__str));
|
|
}
|
|
|
|
private:
|
|
|
|
static constexpr int
|
|
_S_compare(size_type __n1, size_type __n2) noexcept
|
|
{
|
|
return difference_type(__n1 - __n2) > std::numeric_limits<int>::max()
|
|
? std::numeric_limits<int>::max()
|
|
: difference_type(__n1 - __n2) < std::numeric_limits<int>::min()
|
|
? std::numeric_limits<int>::min()
|
|
: static_cast<int>(difference_type(__n1 - __n2));
|
|
}
|
|
|
|
size_t _M_len;
|
|
const _CharT* _M_str;
|
|
};
|
|
|
|
// [string.view.comparison], non-member basic_string_view comparison functions
|
|
|
|
namespace __detail
|
|
{
|
|
// Identity transform to create a non-deduced context, so that only one
|
|
// argument participates in template argument deduction and the other
|
|
// argument gets implicitly converted to the deduced type. See n3766.html.
|
|
template<typename _Tp>
|
|
using __idt = typename std::common_type<_Tp>::type;
|
|
}
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator==(basic_string_view<_CharT, _Traits> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.size() == __y.size() && __x.compare(__y) == 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator==(basic_string_view<_CharT, _Traits> __x,
|
|
__detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
|
|
{ return __x.size() == __y.size() && __x.compare(__y) == 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator==(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.size() == __y.size() && __x.compare(__y) == 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator!=(basic_string_view<_CharT, _Traits> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return !(__x == __y); }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator!=(basic_string_view<_CharT, _Traits> __x,
|
|
__detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
|
|
{ return !(__x == __y); }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator!=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return !(__x == __y); }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator< (basic_string_view<_CharT, _Traits> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.compare(__y) < 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator< (basic_string_view<_CharT, _Traits> __x,
|
|
__detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
|
|
{ return __x.compare(__y) < 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator< (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.compare(__y) < 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator> (basic_string_view<_CharT, _Traits> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.compare(__y) > 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator> (basic_string_view<_CharT, _Traits> __x,
|
|
__detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
|
|
{ return __x.compare(__y) > 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator> (__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.compare(__y) > 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator<=(basic_string_view<_CharT, _Traits> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.compare(__y) <= 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator<=(basic_string_view<_CharT, _Traits> __x,
|
|
__detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
|
|
{ return __x.compare(__y) <= 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator<=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.compare(__y) <= 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator>=(basic_string_view<_CharT, _Traits> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.compare(__y) >= 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator>=(basic_string_view<_CharT, _Traits> __x,
|
|
__detail::__idt<basic_string_view<_CharT, _Traits>> __y) noexcept
|
|
{ return __x.compare(__y) >= 0; }
|
|
|
|
template<typename _CharT, typename _Traits>
|
|
/*constexpr*/ bool
|
|
operator>=(__detail::__idt<basic_string_view<_CharT, _Traits>> __x,
|
|
basic_string_view<_CharT, _Traits> __y) noexcept
|
|
{ return __x.compare(__y) >= 0; }
|
|
|
|
// basic_string_view typedef names
|
|
|
|
using string_view = basic_string_view<char>;
|
|
} /* namespace gdb */
|
|
|
|
#include "gdb_string_view.tcc"
|
|
|
|
#endif // __cplusplus < 201703L
|
|
|
|
namespace gdb {
|
|
|
|
static inline std::string
|
|
to_string(const gdb::string_view &view)
|
|
{
|
|
return { view.data (), view.size () };
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* COMMON_GDB_STRING_VIEW_H */
|