head 1.1; branch 1.1.1; access; symbols netbsd-11-0-RC5:1.1.1.2 netbsd-11-0-RC4:1.1.1.2 netbsd-11-0-RC3:1.1.1.2 netbsd-11-0-RC2:1.1.1.2 netbsd-11-0-RC1:1.1.1.2 gcc-14-3-0:1.1.1.3 perseant-exfatfs-base-20250801:1.1.1.2 netbsd-11:1.1.1.2.0.2 netbsd-11-base:1.1.1.2 gcc-12-5-0:1.1.1.2 perseant-exfatfs-base-20240630:1.1.1.2 gcc-12-4-0:1.1.1.2 perseant-exfatfs:1.1.1.1.0.2 perseant-exfatfs-base:1.1.1.1 gcc-12-3-0:1.1.1.1 FSF:1.1.1; locks; strict; comment @# @; 1.1 date 2023.07.30.05.21.20; author mrg; state Exp; branches 1.1.1.1; next ; commitid tk6nV4mbc9nVEMyE; 1.1.1.1 date 2023.07.30.05.21.20; author mrg; state Exp; branches 1.1.1.1.2.1; next 1.1.1.2; commitid tk6nV4mbc9nVEMyE; 1.1.1.2 date 2024.06.30.07.35.40; author mrg; state Exp; branches; next 1.1.1.3; commitid m7BwZsPdfJvuHYfF; 1.1.1.3 date 2025.09.13.23.45.48; author mrg; state Exp; branches; next ; commitid KwhwN4krNWa6XBaG; 1.1.1.1.2.1 date 2024.07.01.01.00.59; author perseant; state Exp; branches; next ; commitid NkoYLLCQWWw9v4gF; desc @@ 1.1 log @Initial revision @ text @// Streams based on std::span -*- C++ -*- // Copyright The GNU Toolchain Authors. // // 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 // . /** @@file spanstream * This is a Standard C++ Library header. */ #ifndef _GLIBCXX_SPANSTREAM #define _GLIBCXX_SPANSTREAM 1 #pragma GCC system_header #if __cplusplus > 202002L #include #include #include #include #include #if __cpp_lib_span namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION #define __cpp_lib_spanstream 202106L template class basic_spanbuf : public basic_streambuf<_CharT, _Traits> { using __streambuf_type = basic_streambuf<_CharT, _Traits>; public: using char_type = _CharT; using int_type = typename _Traits::int_type; using pos_type = typename _Traits::pos_type; using off_type = typename _Traits::off_type; using traits_type = _Traits; // [spanbuf.ctor], constructors basic_spanbuf() : basic_spanbuf(ios_base::in | ios_base::out) { } explicit basic_spanbuf(ios_base::openmode __which) : __streambuf_type(), _M_mode(__which) { } explicit basic_spanbuf(std::span<_CharT> __s, ios_base::openmode __which = ios_base::in | ios_base::out) : __streambuf_type(), _M_mode(__which) { span(__s); } basic_spanbuf(const basic_spanbuf&) = delete; /** Move constructor. * * Transfers the buffer and pointers into the get and put areas from * `__rhs` to `*this`. * * In this implementation `rhs` is left unchanged, * but that is not guaranteed by the standard. */ basic_spanbuf(basic_spanbuf&& __rhs) : __streambuf_type(__rhs), _M_mode(__rhs._M_mode), _M_buf(__rhs._M_buf) { } // [spanbuf.assign], assignment and swap basic_spanbuf& operator=(const basic_spanbuf&) = delete; basic_spanbuf& operator=(basic_spanbuf&& __rhs) { basic_spanbuf(std::move(__rhs)).swap(*this); return *this; } void swap(basic_spanbuf& __rhs) { __streambuf_type::swap(__rhs); std::swap(_M_mode, __rhs._M_mode); std::swap(_M_buf, __rhs._M_buf); } // [spanbuf.members], member functions std::span<_CharT> span() const noexcept { if (_M_mode & ios_base::out) return {this->pbase(), this->pptr()}; else return _M_buf; } void span(std::span<_CharT> __s) noexcept { _M_buf = __s; if (_M_mode & ios_base::out) { this->setp(__s.data(), __s.data() + __s.size()); if (_M_mode & ios_base::ate) this->pbump(__s.size()); } if (_M_mode & ios_base::in) this->setg(__s.data(), __s.data(), __s.data() + __s.size()); } protected: // [spanbuf.virtuals], overridden virtual functions basic_streambuf<_CharT, _Traits>* setbuf(_CharT* __s, streamsize __n) override { span({__s, __n}); return this; } pos_type seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which = ios_base::in | ios_base::out) override { pos_type __ret = pos_type(off_type(-1)); if (__way == ios_base::beg) { if (0 <= __off && __off <= _M_buf.size()) { if (__which & ios_base::in) this->setg(this->eback(), this->eback() + __off, this->egptr()); if (__which & ios_base::out) { this->setp(this->pbase(), this->epptr()); this->pbump(__off); } __ret = pos_type(__off); } } else { off_type __base; __which &= (ios_base::in|ios_base::out); if (__which == ios_base::out) __base = this->pptr() - this->pbase(); else if (__way == ios_base::cur) { if (__which == ios_base::in) __base = this->gptr() - this->eback(); else return __ret; } else if (__way == ios_base::end) __base = _M_buf.size(); if (__builtin_add_overflow(__base, __off, &__off)) return __ret; if (__off < 0 || __off > _M_buf.size()) return __ret; if (__which & ios_base::in) this->setg(this->eback(), this->eback() + __off, this->egptr()); if (__which & ios_base::out) { this->setp(this->pbase(), this->epptr()); this->pbump(__off); } __ret = pos_type(__off); } return __ret; } pos_type seekpos(pos_type __sp, ios_base::openmode __which = ios_base::in | ios_base::out) override { return seekoff(off_type(__sp), ios_base::beg, __which); } private: ios_base::openmode _M_mode; std::span<_CharT> _M_buf; }; template inline void swap(basic_spanbuf<_CharT, _Traits>& __x, basic_spanbuf<_CharT, _Traits>& __y) { __x.swap(__y); } using spanbuf = basic_spanbuf; using wspanbuf = basic_spanbuf; template class basic_ispanstream : public basic_istream<_CharT, _Traits> { using __istream_type = basic_istream<_CharT, _Traits>; public: using char_type = _CharT; using int_type = typename _Traits::int_type; using pos_type = typename _Traits::pos_type; using off_type = typename _Traits::off_type; using traits_type = _Traits; // [ispanstream.ctor], constructors explicit basic_ispanstream(std::span<_CharT> __s, ios_base::openmode __which = ios_base::in) : __istream_type(std::__addressof(_M_sb)), _M_sb(__s, __which | ios_base::in) { } basic_ispanstream(const basic_ispanstream&) = delete; basic_ispanstream(basic_ispanstream&& __rhs) : __istream_type(std::move(__rhs)), _M_sb(std::move(__rhs._M_sb)) { __istream_type::set_rdbuf(std::addressof(_M_sb)); } template requires ranges::borrowed_range<_Ros> && (!convertible_to<_Ros, std::span<_CharT>>) && convertible_to<_Ros, std::span> explicit basic_ispanstream(_Ros&& __s) : __istream_type(std::__addressof(_M_sb)), _M_sb(ios_base::in) { std::span __sp(std::forward<_Ros>(__s)); _M_sb.span({const_cast<_CharT*>(__sp.data()), __sp.size()}); } // [ispanstream.assign], assignment and swap basic_ispanstream& operator=(const basic_ispanstream&) = delete; basic_ispanstream& operator=(basic_ispanstream&& __rhs) = default; void swap(basic_ispanstream& __rhs) { __istream_type::swap(__rhs); _M_sb.swap(__rhs._M_sb); } // [ispanstream.members], member functions basic_spanbuf<_CharT, _Traits>* rdbuf() const noexcept { return const_cast*>(std::__addressof(_M_sb)); } std::span span() const noexcept { return _M_sb.span(); } void span(std::span<_CharT> __s) noexcept { return _M_sb.span(__s); } template requires ranges::borrowed_range<_Ros> && (!convertible_to<_Ros, std::span<_CharT>>) && convertible_to<_Ros, std::span> void span(_Ros&& __s) noexcept { std::span __sp(std::forward<_Ros>(__s)); _M_sb.span({const_cast<_CharT*>(__sp.data()), __sp.size()}); } private: basic_spanbuf<_CharT, _Traits> _M_sb; }; template inline void swap(basic_ispanstream<_CharT, _Traits>& __x, basic_ispanstream<_CharT, _Traits>& __y) { __x.swap(__y); } using ispanstream = basic_ispanstream; using wispanstream = basic_ispanstream; template class basic_ospanstream : public basic_ostream<_CharT, _Traits> { using __ostream_type = basic_ostream<_CharT, _Traits>; public: using char_type = _CharT; using int_type = typename _Traits::int_type; using pos_type = typename _Traits::pos_type; using off_type = typename _Traits::off_type; using traits_type = _Traits; // [ospanstream.ctor], constructors explicit basic_ospanstream(std::span<_CharT> __s, ios_base::openmode __which = ios_base::out) : __ostream_type(std::__addressof(_M_sb)), _M_sb(__s, __which | ios_base::in) { } basic_ospanstream(const basic_ospanstream&) = delete; basic_ospanstream(basic_ospanstream&& __rhs) : __ostream_type(std::move(__rhs)), _M_sb(std::move(__rhs._M_sb)) { __ostream_type::set_rdbuf(std::addressof(_M_sb)); } // [ospanstream.assign], assignment and swap basic_ospanstream& operator=(const basic_ospanstream&) = delete; basic_ospanstream& operator=(basic_ospanstream&& __rhs) = default; void swap(basic_ospanstream& __rhs) { __ostream_type::swap(__rhs); _M_sb.swap(__rhs._M_sb); } // [ospanstream.members], member functions basic_spanbuf<_CharT, _Traits>* rdbuf() const noexcept { return const_cast*>(std::__addressof(_M_sb)); } std::span<_CharT> span() const noexcept { return _M_sb.span(); } void span(std::span<_CharT> __s) noexcept { return _M_sb.span(__s); } private: basic_spanbuf<_CharT, _Traits> _M_sb; }; template inline void swap(basic_ospanstream<_CharT, _Traits>& __x, basic_ospanstream<_CharT, _Traits>& __y) { __x.swap(__y); } using ospanstream = basic_ospanstream; using wospanstream = basic_ospanstream; template class basic_spanstream : public basic_iostream<_CharT, _Traits> { using __iostream_type = basic_iostream<_CharT, _Traits>; public: using char_type = _CharT; using int_type = typename _Traits::int_type; using pos_type = typename _Traits::pos_type; using off_type = typename _Traits::off_type; using traits_type = _Traits; // [spanstream.ctor], constructors explicit basic_spanstream(std::span<_CharT> __s, ios_base::openmode __which = ios_base::out | ios_base::in) : __iostream_type(std::__addressof(_M_sb)), _M_sb(__s, __which) { } basic_spanstream(const basic_spanstream&) = delete; basic_spanstream(basic_spanstream&& __rhs) : __iostream_type(std::move(__rhs)), _M_sb(std::move(__rhs._M_sb)) { __iostream_type::set_rdbuf(std::addressof(_M_sb)); } // [spanstream.assign], assignment and swap basic_spanstream& operator=(const basic_spanstream&) = delete; basic_spanstream& operator=(basic_spanstream&& __rhs) = default; void swap(basic_spanstream& __rhs) { __iostream_type::swap(__rhs); _M_sb.swap(__rhs._M_sb); } // [spanstream.members], members basic_spanbuf<_CharT, _Traits>* rdbuf() const noexcept { return const_cast*>(std::__addressof(_M_sb)); } std::span<_CharT> span() const noexcept { return _M_sb.span(); } void span(std::span<_CharT> __s) noexcept { return _M_sb.span(__s); } private: basic_spanbuf<_CharT, _Traits> _M_sb; }; template inline void swap(basic_spanstream<_CharT, _Traits>& __x, basic_spanstream<_CharT, _Traits>& __y) { __x.swap(__y); } using spanstream = basic_spanstream; using wspanstream = basic_spanstream; _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // __cpp_lib_span #endif // C++23 #endif // _GLIBCXX_SPANSTREAM @ 1.1.1.1 log @initial import of GCC 12.3.0. major changes in GCC 11 included: - The default mode for C++ is now -std=gnu++17 instead of -std=gnu++14. - When building GCC itself, the host compiler must now support C++11, rather than C++98. - Some short options of the gcov tool have been renamed: -i to -j and -j to -H. - ThreadSanitizer improvements. - Introduce Hardware-assisted AddressSanitizer support. - For targets that produce DWARF debugging information GCC now defaults to DWARF version 5. This can produce up to 25% more compact debug information compared to earlier versions. - Many optimisations. - The existing malloc attribute has been extended so that it can be used to identify allocator/deallocator API pairs. A pair of new -Wmismatched-dealloc and -Wmismatched-new-delete warnings are added. - Other new warnings: -Wsizeof-array-div, enabled by -Wall, warns about divisions of two sizeof operators when the first one is applied to an array and the divisor does not equal the size of the array element. -Wstringop-overread, enabled by default, warns about calls to string functions reading past the end of the arrays passed to them as arguments. -Wtsan, enabled by default, warns about unsupported features in ThreadSanitizer (currently std::atomic_thread_fence). - Enchanced warnings: -Wfree-nonheap-object detects many more instances of calls to deallocation functions with pointers not returned from a dynamic memory allocation function. -Wmaybe-uninitialized diagnoses passing pointers or references to uninitialized memory to functions taking const-qualified arguments. -Wuninitialized detects reads from uninitialized dynamically allocated memory. -Warray-parameter warns about functions with inconsistent array forms. -Wvla-parameter warns about functions with inconsistent VLA forms. - Several new features from the upcoming C2X revision of the ISO C standard are supported with -std=c2x and -std=gnu2x. - Several C++20 features have been implemented. - The C++ front end has experimental support for some of the upcoming C++23 draft. - Several new C++ warnings. - Enhanced Arm, AArch64, x86, and RISC-V CPU support. - The implementation of how program state is tracked within -fanalyzer has been completely rewritten with many enhancements. see https://gcc.gnu.org/gcc-11/changes.html for a full list. major changes in GCC 12 include: - An ABI incompatibility between C and C++ when passing or returning by value certain aggregates containing zero width bit-fields has been discovered on various targets. x86-64, ARM and AArch64 will always ignore them (so there is a C ABI incompatibility between GCC 11 and earlier with GCC 12 or later), PowerPC64 ELFv2 always take them into account (so there is a C++ ABI incompatibility, GCC 4.4 and earlier compatible with GCC 12 or later, incompatible with GCC 4.5 through GCC 11). RISC-V has changed the handling of these already starting with GCC 10. As the ABI requires, MIPS takes them into account handling function return values so there is a C++ ABI incompatibility with GCC 4.5 through 11. - STABS: Support for emitting the STABS debugging format is deprecated and will be removed in the next release. All ports now default to emit DWARF (version 2 or later) debugging info or are obsoleted. - Vectorization is enabled at -O2 which is now equivalent to the original -O2 -ftree-vectorize -fvect-cost-model=very-cheap. - GCC now supports the ShadowCallStack sanitizer. - Support for __builtin_shufflevector compatible with the clang language extension was added. - Support for attribute unavailable was added. - Support for __builtin_dynamic_object_size compatible with the clang language extension was added. - New warnings: -Wbidi-chars warns about potentially misleading UTF-8 bidirectional control characters. -Warray-compare warns about comparisons between two operands of array type. - Some new features from the upcoming C2X revision of the ISO C standard are supported with -std=c2x and -std=gnu2x. - Several C++23 features have been implemented. - Many C++ enhancements across warnings and -f options. see https://gcc.gnu.org/gcc-12/changes.html for a full list. @ text @@ 1.1.1.1.2.1 log @Sync with HEAD. @ text @d137 1 a137 2 __glibcxx_assert(__n >= 0); this->span(std::span<_CharT>(__s, __n)); @ 1.1.1.2 log @import GCC 12.4.0. this includes at least 85 GCC PRs fixed, 2 C, 17 C++, 16 libstdc++-v3, at least 13 target-specific (x86, arm64, riscv mostly), and at least 24 optimisation PRs. @ text @d137 1 a137 2 __glibcxx_assert(__n >= 0); this->span(std::span<_CharT>(__s, __n)); @ 1.1.1.3 log @initial import of GCC 14.3.0. major changes in GCC 13: - improved sanitizer - zstd debug info compression - LTO improvements - SARIF based diagnostic support - new warnings: -Wxor-used-as-pow, -Wenum-int-mismatch, -Wself-move, -Wdangling-reference - many new -Wanalyzer* specific warnings - enhanced warnings: -Wpessimizing-move, -Wredundant-move - new attributes to mark file descriptors, c++23 "assume" - several C23 features added - several C++23 features added - many new features for Arm, x86, RISC-V major changes in GCC 14: - more strict C99 or newer support - ia64* marked deprecated (but seemingly still in GCC 15.) - several new hardening features - support for "hardbool", which can have user supplied values of true/false - explicit support for stack scrubbing upon function exit - better auto-vectorisation support - added clang-compatible __has_feature and __has_extension - more C23, including -std=c23 - several C++26 features added - better diagnostics in C++ templates - new warnings: -Wnrvo, Welaborated-enum-base - many new features for Arm, x86, RISC-V - possible ABI breaking change for SPARC64 and small structures with arrays of floats. @ text @d34 1 a34 6 #include // iostreams #define __glibcxx_want_spanstream #include #ifdef __cpp_lib_spanstream // C++ >= 23 && hosted && lib_span d41 1 d46 2 d452 2 a453 1 #endif // __cpp_lib_spanstream @