Projet_SETI_RISC-V/riscv-gnu-toolchain/gcc/libphobos/libdruntime/core/stdcpp/string_view.d
2023-03-06 14:48:14 +01:00

131 lines
3.1 KiB
D

/**
* D header file for interaction with C++ std::string_view.
*
* Copyright: Copyright (c) 2018 D Language Foundation
* License: Distributed under the
* $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
* (See accompanying file LICENSE)
* Authors: Manu Evans
* Source: $(DRUNTIMESRC core/stdcpp/string_view.d)
*/
module core.stdcpp.string_view;
import core.stdc.stddef : wchar_t;
import core.stdcpp.xutility : StdNamespace;
// hacks to support DMD on Win32
version (CppRuntime_Microsoft)
{
version = CppRuntime_Windows; // use the MS runtime ABI for win32
}
else version (CppRuntime_DigitalMars)
{
version = CppRuntime_Windows; // use the MS runtime ABI for win32
pragma(msg, "std::basic_string_view not supported by DMC");
}
extern(C++, (StdNamespace)):
@nogc:
///
alias string_view = basic_string_view!char;
///
alias u16string_view = basic_string_view!wchar;
///
alias u32string_view = basic_string_view!dchar;
///
alias wstring_view = basic_string_view!wchar_t;
/**
* Character traits classes specify character properties and provide specific
* semantics for certain operations on characters and sequences of characters.
*/
extern(C++, struct) struct char_traits(CharT) {}
/**
* D language counterpart to C++ std::basic_string_view.
*
* C++ reference: $(LINK2 hhttps://en.cppreference.com/w/cpp/string/basic_string_view)
*/
extern(C++, class) struct basic_string_view(T, Traits = char_traits!T)
{
extern(D):
pragma(inline, true):
pure nothrow @nogc:
///
enum size_type npos = size_type.max;
///
alias size_type = size_t;
///
alias difference_type = ptrdiff_t;
///
alias value_type = T;
///
alias pointer = T*;
///
alias const_pointer = const(T)*;
///
alias as_array this;
///
alias toString = as_array;
///
this(const(T)[] str) @trusted { __data = str.ptr; __size = str.length; }
///
alias length = size;
///
alias opDollar = length;
///
size_type size() const @safe { return __size; }
///
bool empty() const @safe { return __size == 0; }
///
const(T)* data() const @safe { return __data; }
///
const(T)[] as_array() const @trusted { return __data[0 .. __size]; }
///
ref const(T) at(size_type i) const @trusted { return __data[0 .. __size][i]; }
///
ref const(T) front() const @safe { return this[0]; }
///
ref const(T) back() const @safe { return this[$-1]; }
private:
// use the proper field names from C++ so debugging doesn't get weird
version (CppRuntime_Windows)
{
const_pointer _Mydata;
size_type _Mysize;
alias __data = _Mydata;
alias __size = _Mysize;
}
else version (CppRuntime_Gcc)
{
size_t _M_len;
const(T)* _M_str;
alias __data = _M_str;
alias __size = _M_len;
}
else version (CppRuntime_Clang)
{
const value_type* __data;
size_type __size;
}
else
{
static assert(false, "C++ runtime not supported");
}
}