Add std::copy_n istreambuf_iterator specialization
* include/bits/stl_algo.h (__copy_n_a(_IIte, _Size, _OIte)): New. (__copy_n_a(istreambuf_iterator<>, _Size, _CharT*)): New declaration. (__copy_n(_IIte, _Size, _OIte, input_iterator_tag)): Adapt to use latter. * include/bits/streambuf_iterator.h (istreambuf_iterator<>): Declare std::__copy_n_a friend. (__copy_n_a(istreambuf_iterator<>, _Size, _CharT*)): New. * testsuite/25_algorithms/copy_n/istreambuf_iterator/1.cc: New. * testsuite/25_algorithms/copy_n/istreambuf_iterator/1_neg.cc: New. * testsuite/25_algorithms/copy_n/istreambuf_iterator/2_neg.cc: New. From-SVN: r276638
This commit is contained in:
parent
6e55630310
commit
8ab38f6cbc
@ -1,5 +1,17 @@
|
||||
2019-10-06 François Dumont <fdumont@gcc.gnu.org>
|
||||
|
||||
* include/bits/stl_algo.h
|
||||
(__copy_n_a(_IIte, _Size, _OIte)): New.
|
||||
(__copy_n_a(istreambuf_iterator<>, _Size, _CharT*)): New declaration.
|
||||
(__copy_n(_IIte, _Size, _OIte, input_iterator_tag)): Adapt to use
|
||||
latter.
|
||||
* include/bits/streambuf_iterator.h (istreambuf_iterator<>): Declare
|
||||
std::__copy_n_a friend.
|
||||
(__copy_n_a(istreambuf_iterator<>, _Size, _CharT*)): New.
|
||||
* testsuite/25_algorithms/copy_n/istreambuf_iterator/1.cc: New.
|
||||
* testsuite/25_algorithms/copy_n/istreambuf_iterator/1_neg.cc: New.
|
||||
* testsuite/25_algorithms/copy_n/istreambuf_iterator/2_neg.cc: New.
|
||||
|
||||
* include/bits/stl_iterator_base_types.h (__iterator_category_t): Define
|
||||
for C++11.
|
||||
(_RequireInputIte): Likewise and use __enable_if_t.
|
||||
|
@ -880,7 +880,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
|
||||
}
|
||||
#endif
|
||||
#endif // C++11
|
||||
|
||||
template<typename _ForwardIterator, typename _Predicate>
|
||||
_GLIBCXX20_CONSTEXPR
|
||||
|
@ -80,6 +80,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__copy_move_a2(istreambuf_iterator<_CharT2>,
|
||||
istreambuf_iterator<_CharT2>, _CharT2*);
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
template<typename _CharT2, typename _Size>
|
||||
friend __enable_if_t<__is_char<_CharT2>::__value, _CharT2*>
|
||||
__copy_n_a(istreambuf_iterator<_CharT2>, _Size, _CharT2*);
|
||||
#endif
|
||||
|
||||
template<typename _CharT2>
|
||||
friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value,
|
||||
istreambuf_iterator<_CharT2> >::__type
|
||||
@ -367,6 +373,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
return __result;
|
||||
}
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
template<typename _CharT, typename _Size>
|
||||
__enable_if_t<__is_char<_CharT>::__value, _CharT*>
|
||||
__copy_n_a(istreambuf_iterator<_CharT> __it, _Size __n, _CharT* __result)
|
||||
{
|
||||
if (__n == 0)
|
||||
return __result;
|
||||
|
||||
__glibcxx_requires_cond(__it._M_sbuf,
|
||||
_M_message(__gnu_debug::__msg_inc_istreambuf)
|
||||
._M_iterator(__it));
|
||||
_CharT* __beg = __result;
|
||||
__result += __it._M_sbuf->sgetn(__beg, __n);
|
||||
__glibcxx_requires_cond(__result - __beg == __n,
|
||||
_M_message(__gnu_debug::__msg_inc_istreambuf)
|
||||
._M_iterator(__it));
|
||||
return __result;
|
||||
}
|
||||
#endif // C++11
|
||||
|
||||
template<typename _CharT>
|
||||
typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
|
||||
istreambuf_iterator<_CharT> >::__type
|
||||
|
@ -0,0 +1,73 @@
|
||||
// Copyright (C) 2019 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.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-do run { target c++11 } }
|
||||
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <iterator>
|
||||
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void test01()
|
||||
{
|
||||
std::stringstream ss("12345");
|
||||
|
||||
std::string ostr(5, '0');
|
||||
typedef std::istreambuf_iterator<char> istrb_ite;
|
||||
auto res = std::copy_n(istrb_ite(ss), 0, ostr.begin());
|
||||
VERIFY( res == ostr.begin() );
|
||||
VERIFY( ostr.front() == '0' );
|
||||
|
||||
res = std::copy_n(istrb_ite(ss), 2, ostr.begin());
|
||||
VERIFY( res == ostr.begin() + 2 );
|
||||
VERIFY( ostr == "12000" );
|
||||
|
||||
res = std::copy_n(istrb_ite(ss), 3, ostr.begin() + 2);
|
||||
VERIFY( res == ostr.begin() + 5 );
|
||||
VERIFY( ostr == "12345" );
|
||||
}
|
||||
|
||||
void test02()
|
||||
{
|
||||
std::stringstream ss("12345");
|
||||
|
||||
std::string ostr(5, '0');
|
||||
typedef std::istreambuf_iterator<char> istrb_ite;
|
||||
|
||||
istrb_ite ibfit(ss);
|
||||
auto res = std::copy_n(ibfit, 3, std::copy_n(ibfit, 2, ostr.begin()));
|
||||
VERIFY( res == ostr.begin() + 5 );
|
||||
VERIFY( ostr == "12345" );
|
||||
}
|
||||
|
||||
void test03()
|
||||
{
|
||||
std::string ostr(5, '0');
|
||||
typedef std::istreambuf_iterator<char> istrb_ite;
|
||||
|
||||
auto res = std::copy_n(istrb_ite(), 0, ostr.begin());
|
||||
VERIFY( res == ostr.begin() );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
test02();
|
||||
test03();
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
// Copyright (C) 2019 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.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-do run { target c++11 xfail *-*-* } }
|
||||
// { dg-require-debug-mode { } }
|
||||
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <iterator>
|
||||
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void test01()
|
||||
{
|
||||
std::stringstream ss("12345");
|
||||
|
||||
std::string ostr(10, '0');
|
||||
typedef std::istreambuf_iterator<char> istrb_ite;
|
||||
std::copy_n(istrb_ite(ss), 10, ostr.begin());
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
// Copyright (C) 2019 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.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-do run { target c++11 xfail *-*-* } }
|
||||
// { dg-require-debug-mode { } }
|
||||
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <iterator>
|
||||
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void test01()
|
||||
{
|
||||
std::string ostr(10, '0');
|
||||
typedef std::istreambuf_iterator<char> istrb_ite;
|
||||
std::copy_n(istrb_ite(), 10, ostr.begin());
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user