| /** |
| * 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"); |
| } |
| } |