2000-10-05 13:27:02 +02:00
|
|
|
// The template and inlines for the -*- C++ -*- internal _Meta class.
|
|
|
|
|
2018-01-03 11:03:58 +01:00
|
|
|
// Copyright (C) 1997-2018 Free Software Foundation, Inc.
|
2000-10-05 13:27:02 +02:00
|
|
|
//
|
|
|
|
// 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
|
2009-04-09 17:00:19 +02:00
|
|
|
// Free Software Foundation; either version 3, or (at your option)
|
2000-10-05 13:27:02 +02:00
|
|
|
// 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.
|
|
|
|
|
2009-04-09 17:00:19 +02:00
|
|
|
// 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.
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2009-04-09 17:00:19 +02:00
|
|
|
// 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/>.
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2010-12-19 10:21:16 +01:00
|
|
|
/** @file bits/valarray_after.h
|
c_io_stdio.h: Correct grammar in comments.
2001-11-02 Phil Edwards <pme@gcc.gnu.org>
* config/io/c_io_stdio.h: Correct grammar in comments.
* docs/doxygen/Intro.3: Expand "top-level" man page.
* docs/doxygen/doxygroups.cc: New module definitions (comments).
* docs/doxygen/mainpage.doxy: Tweaks.
* docs/doxygen/run_doxygen: Update Doxygen version, massage man pages.
Add @file hooks so that headers are considered to be documented.
* include/bits/basic_ios.h, include/bits/basic_file.h,
include/bits/basic_string.h, include/bits/boost_concept_check.h,
include/bits/char_traits.h, include/bits/codecvt.h,
include/bits/concept_check.h, include/bits/cpp_type_traits.h,
include/bits/fpos.h, include/bits/gslice.h, include/bits/gslice_array.h,
include/bits/indirect_array.h, include/bits/ios_base.h,
include/bits/locale_facets.h, include/bits/localefwd.h,
include/bits/mask_array.h, include/bits/pthread_allocimpl.h,
include/bits/slice.h, include/bits/slice_array.h,
include/bits/std_algorithm.h, include/bits/std_bitset.h,
include/bits/std_complex.h, include/bits/std_deque.h,
include/bits/std_fstream.h, include/bits/std_functional.h,
include/bits/std_iomanip.h, include/bits/std_ios.h,
include/bits/std_iosfwd.h, include/bits/std_iostream.h,
include/bits/std_istream.h, include/bits/std_iterator.h,
include/bits/std_limits.h, include/bits/std_list.h,
include/bits/std_locale.h, include/bits/std_map.h,
include/bits/std_memory.h, include/bits/std_numeric.h,
include/bits/std_ostream.h, include/bits/std_queue.h,
include/bits/std_set.h, include/bits/std_sstream.h,
include/bits/std_stack.h, include/bits/std_streambuf.h,
include/bits/std_string.h, include/bits/std_utility.h,
include/bits/std_valarray.h, include/bits/std_vector.h,
include/bits/stl_algo.h, include/bits/stl_alloc.h,
include/bits/stl_bvector.h, include/bits/stl_construct.h,
include/bits/stl_deque.h, include/bits/stl_heap.h,
include/bits/stl_iterator.h, include/bits/stl_iterator_base_funcs.h,
include/bits/stl_iterator_base_types.h, include/bits/stl_list.h,
include/bits/stl_map.h, include/bits/stl_multimap.h,
include/bits/stl_multiset.h, include/bits/stl_numeric.h,
include/bits/stl_pair.h, include/bits/stl_pthread_alloc.h,
include/bits/stl_queue.h, include/bits/stl_raw_storage_iter.h,
include/bits/stl_relops.h, include/bits/stl_set.h,
include/bits/stl_stack.h, include/bits/stl_tempbuf.h,
include/bits/stl_threads.h, include/bits/stl_tree.h,
include/bits/stl_uninitialized.h, include/bits/stl_vector.h,
include/bits/stream_iterator.h, include/bits/streambuf_iterator.h,
include/bits/stringfwd.h, include/bits/type_traits.h,
include/bits/valarray_array.h, include/bits/valarray_meta.h:
Add hooks, tweak comments only.
* include/bits/stl_algobase.h (swap, min, iter_swap): Also
document these functions.
* include/bits/stl_function.h: Tweak link comments.
From-SVN: r46717
2001-11-02 18:38:11 +01:00
|
|
|
* This is an internal header file, included by other library headers.
|
2010-12-19 10:21:16 +01:00
|
|
|
* Do not attempt to use it directly. @headername{valarray}
|
c_io_stdio.h: Correct grammar in comments.
2001-11-02 Phil Edwards <pme@gcc.gnu.org>
* config/io/c_io_stdio.h: Correct grammar in comments.
* docs/doxygen/Intro.3: Expand "top-level" man page.
* docs/doxygen/doxygroups.cc: New module definitions (comments).
* docs/doxygen/mainpage.doxy: Tweaks.
* docs/doxygen/run_doxygen: Update Doxygen version, massage man pages.
Add @file hooks so that headers are considered to be documented.
* include/bits/basic_ios.h, include/bits/basic_file.h,
include/bits/basic_string.h, include/bits/boost_concept_check.h,
include/bits/char_traits.h, include/bits/codecvt.h,
include/bits/concept_check.h, include/bits/cpp_type_traits.h,
include/bits/fpos.h, include/bits/gslice.h, include/bits/gslice_array.h,
include/bits/indirect_array.h, include/bits/ios_base.h,
include/bits/locale_facets.h, include/bits/localefwd.h,
include/bits/mask_array.h, include/bits/pthread_allocimpl.h,
include/bits/slice.h, include/bits/slice_array.h,
include/bits/std_algorithm.h, include/bits/std_bitset.h,
include/bits/std_complex.h, include/bits/std_deque.h,
include/bits/std_fstream.h, include/bits/std_functional.h,
include/bits/std_iomanip.h, include/bits/std_ios.h,
include/bits/std_iosfwd.h, include/bits/std_iostream.h,
include/bits/std_istream.h, include/bits/std_iterator.h,
include/bits/std_limits.h, include/bits/std_list.h,
include/bits/std_locale.h, include/bits/std_map.h,
include/bits/std_memory.h, include/bits/std_numeric.h,
include/bits/std_ostream.h, include/bits/std_queue.h,
include/bits/std_set.h, include/bits/std_sstream.h,
include/bits/std_stack.h, include/bits/std_streambuf.h,
include/bits/std_string.h, include/bits/std_utility.h,
include/bits/std_valarray.h, include/bits/std_vector.h,
include/bits/stl_algo.h, include/bits/stl_alloc.h,
include/bits/stl_bvector.h, include/bits/stl_construct.h,
include/bits/stl_deque.h, include/bits/stl_heap.h,
include/bits/stl_iterator.h, include/bits/stl_iterator_base_funcs.h,
include/bits/stl_iterator_base_types.h, include/bits/stl_list.h,
include/bits/stl_map.h, include/bits/stl_multimap.h,
include/bits/stl_multiset.h, include/bits/stl_numeric.h,
include/bits/stl_pair.h, include/bits/stl_pthread_alloc.h,
include/bits/stl_queue.h, include/bits/stl_raw_storage_iter.h,
include/bits/stl_relops.h, include/bits/stl_set.h,
include/bits/stl_stack.h, include/bits/stl_tempbuf.h,
include/bits/stl_threads.h, include/bits/stl_tree.h,
include/bits/stl_uninitialized.h, include/bits/stl_vector.h,
include/bits/stream_iterator.h, include/bits/streambuf_iterator.h,
include/bits/stringfwd.h, include/bits/type_traits.h,
include/bits/valarray_array.h, include/bits/valarray_meta.h:
Add hooks, tweak comments only.
* include/bits/stl_algobase.h (swap, min, iter_swap): Also
document these functions.
* include/bits/stl_function.h: Tweak link comments.
From-SVN: r46717
2001-11-02 18:38:11 +01:00
|
|
|
*/
|
|
|
|
|
2006-12-06 00:24:07 +01:00
|
|
|
// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>
|
|
|
|
|
2003-07-05 06:05:45 +02:00
|
|
|
#ifndef _VALARRAY_AFTER_H
|
|
|
|
#define _VALARRAY_AFTER_H 1
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2001-02-19 19:52:25 +01:00
|
|
|
#pragma GCC system_header
|
|
|
|
|
PR libstdc++/36104 part four
2011-01-30 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/36104 part four
* include/bits/c++config (_GLIBCXX_STD): Remove.
(_GLIBCXX_STD_D, _GLIBCXX_PR): Now _GLIBCXX_STD_C.
(_GLIBCXX_P): Now _GLIBCXX_STD_A.
(_GLIBCXX_NAMESPACE_DEBUG, _GLIBCXX_NAMESPACE_PARALLEL,
_GLIBCXX_NAMESPACE_PROFILE, _GLIBCXX_NAMESPACE_VERSION): Remove.
(_GLIBCXX_INLINE_DEBUG, _GLIBCXX_INLINE_PARALLEL,
_GLIBCXX_INLINE_PROFILE): Remove.
(_GLIBCXX_BEGIN_NAMESPACE(X)): Remove.
(_GLIBCXX_END_NAMESPACE): Remove.
(_GLIBCXX_BEGIN_NESTED_NAMESPACE(X, Y)): Remove.
(_GLIBCXX_END_NESTED_NAMESPACE): Remove.
(_GLIBCXX_BEGIN_NAMESPACE_ALGO): Add.
(_GLIBCXX_END_NAMESPACE_ALGO): Add.
(_GLIBCXX_BEGIN_NAMESPACE_CONTAINER): Add.
(_GLIBCXX_END_NAMESPACE_CONTAINER): Add.
(_GLIBCXX_BEGIN_NAMESPACE_VERSION): Add.
(_GLIBCXX_END_NAMESPACE_VERSION): Add.
(_GLIBCXX_BEGIN_LDBL_NAMESPACE): To _GLIBCXX_BEGIN_NAMESPACE_LDBL.
(_GLIBCXX_END_LDBL_NAMESPACE): To _GLIBCXX_END_NAMESPACE_LDBL.
(_GLIBCXX_VISIBILITY_ATTR): Revert to _GLIBCXX_VISIBILITY.
* include/*: Use new macros for namespace scope.
* config/*: Same.
* src/*: Same.
* src/Makefile.am (sources): Remove debug_list.cc, add
compatibility-debug_list-2.cc.
(parallel_sources): Remove parallel_list.cc, add
compatibility-parallel_list-2.cc.
(compatibility-parallel_list-2.[o,lo]): New rule.
* src/Makefile.in: Regenerate.
* src/debug_list.cc: Remove.
* src/parallel_list.cc: Remove.
* src/compatibility-list-2.cc: New.
* src/compatibility-debug_list-2.cc: New.
* src/compatibility-parallel_list-2.cc: New.
* doc/doxygen/user.cfg.in: Adjust macros.
* testsuite/20_util/auto_ptr/assign_neg.cc: Adjust line numbers, macros.
* testsuite/20_util/declval/requirements/1_neg.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg1.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg2.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg3.cc: Same.
* testsuite/20_util/forward/c_neg.cc: Same.
* testsuite/20_util/forward/f_neg.cc: Same.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Same.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Same.
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Same.
* testsuite/20_util/ratio/operations/ops_overflow_neg.cc: Same.
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Same.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Same.
* testsuite/23_containers/forward_list/capacity/1.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
assign_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
insert_neg.cc: Same.
* testsuite/23_containers/list/capacity/29134.cc: Same.
* testsuite/23_containers/list/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/insert_neg.cc: Same.
* testsuite/23_containers/vector/bool/capacity/29134.cc: Same.
* testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Same.
* testsuite/25_algorithms/sort/35588.cc: Same.
* testsuite/27_io/ios_base/cons/assign_neg.cc: Same.
* testsuite/27_io/ios_base/cons/copy_neg.cc: Same.
* testsuite/ext/profile/mutex_extensions_neg.cc: Same.
* testsuite/ext/profile/profiler_algos.cc: Same.
* testsuite/ext/type_traits/add_unsigned_floating_neg.cc: Same.
* testsuite/ext/type_traits/add_unsigned_integer_neg.cc: Same.
* testsuite/ext/type_traits/remove_unsigned_floating_neg.cc: Same.
* testsuite/ext/type_traits/remove_unsigned_integer_neg.cc: Same.
* testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc: Same.
From-SVN: r169421
2011-01-30 23:39:36 +01:00
|
|
|
namespace std _GLIBCXX_VISIBILITY(default)
|
|
|
|
{
|
|
|
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
2005-12-19 01:56:05 +01:00
|
|
|
|
PR libstdc++/83860 avoid dangling references in valarray closure types
Store nested closures by value not by reference, to prevent holding
invalid references to temporaries that have been destroyed. This
changes the layout of the closure types, so change their linkage names,
but moving them to a different namespace.
PR libstdc++/57997
PR libstdc++/83860
* include/bits/gslice_array.h (gslice_array): Define default
constructor as deleted, as per C++11 standard.
* include/bits/mask_array.h (mask_array): Likewise.
* include/bits/slice_array.h (slice_array): Likewise.
* include/bits/valarray_after.h (_GBase, _GClos, _IBase, _IClos): Move
to namespace __detail.
(_GBase::_M_expr, _IBase::_M_expr): Use _ValArrayRef for type of data
members.
* include/bits/valarray_before.h (_ValArrayRef): New helper for type
of data members in closure objects.
(_FunBase, _ValFunClos, _RefFunClos, _UnBase, _UnClos, _BinBase)
(_BinBase2, _BinBase1, _BinClos, _SBase, _SClos): Move to namespace
__detail.
(_FunBase::_M_expr, _UnBase::_M_expr, _BinBase::_M_expr1)
(_BinBase::_M_expr2, _BinBase2::_M_expr1, _BinBase1::_M_expr2)
(_SBase::_M_expr): Use _ValArrayRef for type of data members.
* include/std/valarray (_UnClos, _BinClos, _SClos, _GClos, _IClos)
(_ValFunClos, _RefFunClos): Move to namespace __detail and add
using-declarations to namespace std.
* testsuite/26_numerics/valarray/83860.cc: New.
From-SVN: r259844
2018-05-02 18:41:46 +02:00
|
|
|
namespace __detail
|
|
|
|
{
|
2004-07-08 22:48:04 +02:00
|
|
|
//
|
|
|
|
// gslice_array closure.
|
|
|
|
//
|
|
|
|
template<class _Dom>
|
|
|
|
class _GBase
|
|
|
|
{
|
2000-10-05 13:27:02 +02:00
|
|
|
public:
|
2004-07-08 22:48:04 +02:00
|
|
|
typedef typename _Dom::value_type value_type;
|
|
|
|
|
|
|
|
_GBase (const _Dom& __e, const valarray<size_t>& __i)
|
|
|
|
: _M_expr (__e), _M_index(__i) {}
|
|
|
|
|
|
|
|
value_type
|
|
|
|
operator[] (size_t __i) const
|
|
|
|
{ return _M_expr[_M_index[__i]]; }
|
|
|
|
|
|
|
|
size_t
|
|
|
|
size () const
|
|
|
|
{ return _M_index.size(); }
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2000-10-05 13:27:02 +02:00
|
|
|
private:
|
PR libstdc++/83860 avoid dangling references in valarray closure types
Store nested closures by value not by reference, to prevent holding
invalid references to temporaries that have been destroyed. This
changes the layout of the closure types, so change their linkage names,
but moving them to a different namespace.
PR libstdc++/57997
PR libstdc++/83860
* include/bits/gslice_array.h (gslice_array): Define default
constructor as deleted, as per C++11 standard.
* include/bits/mask_array.h (mask_array): Likewise.
* include/bits/slice_array.h (slice_array): Likewise.
* include/bits/valarray_after.h (_GBase, _GClos, _IBase, _IClos): Move
to namespace __detail.
(_GBase::_M_expr, _IBase::_M_expr): Use _ValArrayRef for type of data
members.
* include/bits/valarray_before.h (_ValArrayRef): New helper for type
of data members in closure objects.
(_FunBase, _ValFunClos, _RefFunClos, _UnBase, _UnClos, _BinBase)
(_BinBase2, _BinBase1, _BinClos, _SBase, _SClos): Move to namespace
__detail.
(_FunBase::_M_expr, _UnBase::_M_expr, _BinBase::_M_expr1)
(_BinBase::_M_expr2, _BinBase2::_M_expr1, _BinBase1::_M_expr2)
(_SBase::_M_expr): Use _ValArrayRef for type of data members.
* include/std/valarray (_UnClos, _BinClos, _SClos, _GClos, _IClos)
(_ValFunClos, _RefFunClos): Move to namespace __detail and add
using-declarations to namespace std.
* testsuite/26_numerics/valarray/83860.cc: New.
From-SVN: r259844
2018-05-02 18:41:46 +02:00
|
|
|
typename _ValArrayRef<_Dom>::__type _M_expr;
|
|
|
|
const valarray<size_t>& _M_index;
|
2000-10-05 13:27:02 +02:00
|
|
|
};
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
template<typename _Tp>
|
|
|
|
class _GBase<_Array<_Tp> >
|
|
|
|
{
|
2000-10-05 13:27:02 +02:00
|
|
|
public:
|
2004-07-08 22:48:04 +02:00
|
|
|
typedef _Tp value_type;
|
|
|
|
|
|
|
|
_GBase (_Array<_Tp> __a, const valarray<size_t>& __i)
|
|
|
|
: _M_array (__a), _M_index(__i) {}
|
|
|
|
|
|
|
|
value_type
|
|
|
|
operator[] (size_t __i) const
|
|
|
|
{ return _M_array._M_data[_M_index[__i]]; }
|
|
|
|
|
|
|
|
size_t
|
|
|
|
size () const
|
|
|
|
{ return _M_index.size(); }
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2000-10-05 13:27:02 +02:00
|
|
|
private:
|
2004-07-08 22:48:04 +02:00
|
|
|
const _Array<_Tp> _M_array;
|
|
|
|
const valarray<size_t>& _M_index;
|
2000-10-05 13:27:02 +02:00
|
|
|
};
|
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
template<class _Dom>
|
|
|
|
struct _GClos<_Expr, _Dom>
|
|
|
|
: _GBase<_Dom>
|
|
|
|
{
|
|
|
|
typedef _GBase<_Dom> _Base;
|
|
|
|
typedef typename _Base::value_type value_type;
|
|
|
|
|
|
|
|
_GClos (const _Dom& __e, const valarray<size_t>& __i)
|
|
|
|
: _Base (__e, __i) {}
|
2000-10-05 13:27:02 +02:00
|
|
|
};
|
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
template<typename _Tp>
|
|
|
|
struct _GClos<_ValArray, _Tp>
|
|
|
|
: _GBase<_Array<_Tp> >
|
|
|
|
{
|
|
|
|
typedef _GBase<_Array<_Tp> > _Base;
|
|
|
|
typedef typename _Base::value_type value_type;
|
|
|
|
|
|
|
|
_GClos (_Array<_Tp> __a, const valarray<size_t>& __i)
|
|
|
|
: _Base (__a, __i) {}
|
2000-10-05 13:27:02 +02:00
|
|
|
};
|
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
//
|
|
|
|
// indirect_array closure
|
|
|
|
//
|
|
|
|
template<class _Dom>
|
|
|
|
class _IBase
|
|
|
|
{
|
2000-10-05 13:27:02 +02:00
|
|
|
public:
|
2004-07-08 22:48:04 +02:00
|
|
|
typedef typename _Dom::value_type value_type;
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
_IBase (const _Dom& __e, const valarray<size_t>& __i)
|
|
|
|
: _M_expr (__e), _M_index (__i) {}
|
|
|
|
|
|
|
|
value_type
|
|
|
|
operator[] (size_t __i) const
|
|
|
|
{ return _M_expr[_M_index[__i]]; }
|
|
|
|
|
2004-08-16 16:50:31 +02:00
|
|
|
size_t
|
|
|
|
size() const
|
|
|
|
{ return _M_index.size(); }
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2000-10-05 13:27:02 +02:00
|
|
|
private:
|
PR libstdc++/83860 avoid dangling references in valarray closure types
Store nested closures by value not by reference, to prevent holding
invalid references to temporaries that have been destroyed. This
changes the layout of the closure types, so change their linkage names,
but moving them to a different namespace.
PR libstdc++/57997
PR libstdc++/83860
* include/bits/gslice_array.h (gslice_array): Define default
constructor as deleted, as per C++11 standard.
* include/bits/mask_array.h (mask_array): Likewise.
* include/bits/slice_array.h (slice_array): Likewise.
* include/bits/valarray_after.h (_GBase, _GClos, _IBase, _IClos): Move
to namespace __detail.
(_GBase::_M_expr, _IBase::_M_expr): Use _ValArrayRef for type of data
members.
* include/bits/valarray_before.h (_ValArrayRef): New helper for type
of data members in closure objects.
(_FunBase, _ValFunClos, _RefFunClos, _UnBase, _UnClos, _BinBase)
(_BinBase2, _BinBase1, _BinClos, _SBase, _SClos): Move to namespace
__detail.
(_FunBase::_M_expr, _UnBase::_M_expr, _BinBase::_M_expr1)
(_BinBase::_M_expr2, _BinBase2::_M_expr1, _BinBase1::_M_expr2)
(_SBase::_M_expr): Use _ValArrayRef for type of data members.
* include/std/valarray (_UnClos, _BinClos, _SClos, _GClos, _IClos)
(_ValFunClos, _RefFunClos): Move to namespace __detail and add
using-declarations to namespace std.
* testsuite/26_numerics/valarray/83860.cc: New.
From-SVN: r259844
2018-05-02 18:41:46 +02:00
|
|
|
typename _ValArrayRef<_Dom>::__type _M_expr;
|
|
|
|
const valarray<size_t>& _M_index;
|
2000-10-05 13:27:02 +02:00
|
|
|
};
|
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
template<class _Dom>
|
|
|
|
struct _IClos<_Expr, _Dom>
|
|
|
|
: _IBase<_Dom>
|
|
|
|
{
|
|
|
|
typedef _IBase<_Dom> _Base;
|
|
|
|
typedef typename _Base::value_type value_type;
|
|
|
|
|
|
|
|
_IClos (const _Dom& __e, const valarray<size_t>& __i)
|
|
|
|
: _Base (__e, __i) {}
|
2000-10-05 13:27:02 +02:00
|
|
|
};
|
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
template<typename _Tp>
|
|
|
|
struct _IClos<_ValArray, _Tp>
|
|
|
|
: _IBase<valarray<_Tp> >
|
|
|
|
{
|
|
|
|
typedef _IBase<valarray<_Tp> > _Base;
|
|
|
|
typedef _Tp value_type;
|
|
|
|
|
|
|
|
_IClos (const valarray<_Tp>& __a, const valarray<size_t>& __i)
|
|
|
|
: _Base (__a, __i) {}
|
2000-10-05 13:27:02 +02:00
|
|
|
};
|
PR libstdc++/83860 avoid dangling references in valarray closure types
Store nested closures by value not by reference, to prevent holding
invalid references to temporaries that have been destroyed. This
changes the layout of the closure types, so change their linkage names,
but moving them to a different namespace.
PR libstdc++/57997
PR libstdc++/83860
* include/bits/gslice_array.h (gslice_array): Define default
constructor as deleted, as per C++11 standard.
* include/bits/mask_array.h (mask_array): Likewise.
* include/bits/slice_array.h (slice_array): Likewise.
* include/bits/valarray_after.h (_GBase, _GClos, _IBase, _IClos): Move
to namespace __detail.
(_GBase::_M_expr, _IBase::_M_expr): Use _ValArrayRef for type of data
members.
* include/bits/valarray_before.h (_ValArrayRef): New helper for type
of data members in closure objects.
(_FunBase, _ValFunClos, _RefFunClos, _UnBase, _UnClos, _BinBase)
(_BinBase2, _BinBase1, _BinClos, _SBase, _SClos): Move to namespace
__detail.
(_FunBase::_M_expr, _UnBase::_M_expr, _BinBase::_M_expr1)
(_BinBase::_M_expr2, _BinBase2::_M_expr1, _BinBase1::_M_expr2)
(_SBase::_M_expr): Use _ValArrayRef for type of data members.
* include/std/valarray (_UnClos, _BinClos, _SClos, _GClos, _IClos)
(_ValFunClos, _RefFunClos): Move to namespace __detail and add
using-declarations to namespace std.
* testsuite/26_numerics/valarray/83860.cc: New.
From-SVN: r259844
2018-05-02 18:41:46 +02:00
|
|
|
} // namespace __detail
|
2004-07-08 22:48:04 +02:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
//
|
|
|
|
// class _Expr
|
2004-02-08 05:46:42 +01:00
|
|
|
//
|
|
|
|
template<class _Clos, typename _Tp>
|
2002-08-02 20:10:38 +02:00
|
|
|
class _Expr
|
|
|
|
{
|
2000-10-05 13:27:02 +02:00
|
|
|
public:
|
2002-08-02 20:10:38 +02:00
|
|
|
typedef _Tp value_type;
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
_Expr(const _Clos&);
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
const _Clos& operator()() const;
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
value_type operator[](size_t) const;
|
|
|
|
valarray<value_type> operator[](slice) const;
|
|
|
|
valarray<value_type> operator[](const gslice&) const;
|
|
|
|
valarray<value_type> operator[](const valarray<bool>&) const;
|
|
|
|
valarray<value_type> operator[](const valarray<size_t>&) const;
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_UnClos<__unary_plus, std::_Expr, _Clos>, value_type>
|
|
|
|
operator+() const;
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_UnClos<__negate, std::_Expr, _Clos>, value_type>
|
|
|
|
operator-() const;
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_UnClos<__bitwise_not, std::_Expr, _Clos>, value_type>
|
|
|
|
operator~() const;
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_UnClos<__logical_not, std::_Expr, _Clos>, bool>
|
|
|
|
operator!() const;
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
size_t size() const;
|
|
|
|
value_type sum() const;
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
valarray<value_type> shift(int) const;
|
|
|
|
valarray<value_type> cshift(int) const;
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
value_type min() const;
|
|
|
|
value_type max() const;
|
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
valarray<value_type> apply(value_type (*)(const value_type&)) const;
|
|
|
|
valarray<value_type> apply(value_type (*)(value_type)) const;
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2000-10-05 13:27:02 +02:00
|
|
|
private:
|
2002-08-02 20:10:38 +02:00
|
|
|
const _Clos _M_closure;
|
2000-10-05 13:27:02 +02:00
|
|
|
};
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::_Expr(const _Clos& __c) : _M_closure(__c) {}
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline const _Clos&
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::operator()() const
|
2000-10-05 13:27:02 +02:00
|
|
|
{ return _M_closure; }
|
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline _Tp
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::operator[](size_t __i) const
|
2000-10-05 13:27:02 +02:00
|
|
|
{ return _M_closure[__i]; }
|
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline valarray<_Tp>
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::operator[](slice __s) const
|
2005-12-17 16:36:35 +01:00
|
|
|
{
|
|
|
|
valarray<_Tp> __v = valarray<_Tp>(*this)[__s];
|
|
|
|
return __v;
|
|
|
|
}
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline valarray<_Tp>
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::operator[](const gslice& __gs) const
|
2005-12-17 16:36:35 +01:00
|
|
|
{
|
|
|
|
valarray<_Tp> __v = valarray<_Tp>(*this)[__gs];
|
|
|
|
return __v;
|
|
|
|
}
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline valarray<_Tp>
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::operator[](const valarray<bool>& __m) const
|
2005-12-17 16:36:35 +01:00
|
|
|
{
|
|
|
|
valarray<_Tp> __v = valarray<_Tp>(*this)[__m];
|
|
|
|
return __v;
|
|
|
|
}
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline valarray<_Tp>
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::operator[](const valarray<size_t>& __i) const
|
2005-12-17 16:36:35 +01:00
|
|
|
{
|
|
|
|
valarray<_Tp> __v = valarray<_Tp>(*this)[__i];
|
|
|
|
return __v;
|
|
|
|
}
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline size_t
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::size() const
|
2005-12-17 16:36:35 +01:00
|
|
|
{ return _M_closure.size(); }
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
template<class _Clos, typename _Tp>
|
2002-08-02 20:10:38 +02:00
|
|
|
inline valarray<_Tp>
|
|
|
|
_Expr<_Clos, _Tp>::shift(int __n) const
|
2005-12-17 16:36:35 +01:00
|
|
|
{
|
|
|
|
valarray<_Tp> __v = valarray<_Tp>(*this).shift(__n);
|
|
|
|
return __v;
|
|
|
|
}
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
template<class _Clos, typename _Tp>
|
2002-08-02 20:10:38 +02:00
|
|
|
inline valarray<_Tp>
|
|
|
|
_Expr<_Clos, _Tp>::cshift(int __n) const
|
2005-12-17 16:36:35 +01:00
|
|
|
{
|
|
|
|
valarray<_Tp> __v = valarray<_Tp>(*this).cshift(__n);
|
|
|
|
return __v;
|
|
|
|
}
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
template<class _Clos, typename _Tp>
|
2002-08-02 20:10:38 +02:00
|
|
|
inline valarray<_Tp>
|
|
|
|
_Expr<_Clos, _Tp>::apply(_Tp __f(const _Tp&)) const
|
2005-12-17 16:36:35 +01:00
|
|
|
{
|
|
|
|
valarray<_Tp> __v = valarray<_Tp>(*this).apply(__f);
|
|
|
|
return __v;
|
|
|
|
}
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2000-10-05 13:27:02 +02:00
|
|
|
template<class _Clos, typename _Tp>
|
2002-08-02 20:10:38 +02:00
|
|
|
inline valarray<_Tp>
|
|
|
|
_Expr<_Clos, _Tp>::apply(_Tp __f(_Tp)) const
|
2005-12-17 16:36:35 +01:00
|
|
|
{
|
|
|
|
valarray<_Tp> __v = valarray<_Tp>(*this).apply(__f);
|
|
|
|
return __v;
|
|
|
|
}
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
// XXX: replace this with a more robust summation algorithm.
|
|
|
|
template<class _Clos, typename _Tp>
|
2000-10-05 13:27:02 +02:00
|
|
|
inline _Tp
|
2004-07-08 22:48:04 +02:00
|
|
|
_Expr<_Clos, _Tp>::sum() const
|
2000-10-05 13:27:02 +02:00
|
|
|
{
|
2002-08-02 20:10:38 +02:00
|
|
|
size_t __n = _M_closure.size();
|
2004-02-08 05:46:42 +01:00
|
|
|
if (__n == 0)
|
2002-08-02 20:10:38 +02:00
|
|
|
return _Tp();
|
2004-02-08 05:46:42 +01:00
|
|
|
else
|
2002-08-02 20:10:38 +02:00
|
|
|
{
|
|
|
|
_Tp __s = _M_closure[--__n];
|
|
|
|
while (__n != 0)
|
|
|
|
__s += _M_closure[--__n];
|
|
|
|
return __s;
|
2000-10-05 13:27:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template<class _Clos, typename _Tp>
|
2002-08-02 20:10:38 +02:00
|
|
|
inline _Tp
|
|
|
|
_Expr<_Clos, _Tp>::min() const
|
|
|
|
{ return __valarray_min(_M_closure); }
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
template<class _Clos, typename _Tp>
|
2002-08-02 20:10:38 +02:00
|
|
|
inline _Tp
|
|
|
|
_Expr<_Clos, _Tp>::max() const
|
|
|
|
{ return __valarray_max(_M_closure); }
|
2004-02-08 05:46:42 +01:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
template<class _Dom, typename _Tp>
|
2004-07-08 22:48:04 +02:00
|
|
|
inline _Expr<_UnClos<__logical_not, _Expr, _Dom>, bool>
|
|
|
|
_Expr<_Dom, _Tp>::operator!() const
|
2000-10-05 13:27:02 +02:00
|
|
|
{
|
2004-07-08 22:48:04 +02:00
|
|
|
typedef _UnClos<__logical_not, std::_Expr, _Dom> _Closure;
|
2009-07-09 00:26:50 +02:00
|
|
|
return _Expr<_Closure, bool>(_Closure(this->_M_closure));
|
2000-10-05 13:27:02 +02:00
|
|
|
}
|
|
|
|
|
2002-08-03 01:08:40 +02:00
|
|
|
#define _DEFINE_EXPR_UNARY_OPERATOR(_Op, _Name) \
|
|
|
|
template<class _Dom, typename _Tp> \
|
2004-07-08 22:48:04 +02:00
|
|
|
inline _Expr<_UnClos<_Name, std::_Expr, _Dom>, _Tp> \
|
|
|
|
_Expr<_Dom, _Tp>::operator _Op() const \
|
2002-08-03 01:08:40 +02:00
|
|
|
{ \
|
2004-07-08 22:48:04 +02:00
|
|
|
typedef _UnClos<_Name, std::_Expr, _Dom> _Closure; \
|
|
|
|
return _Expr<_Closure, _Tp>(_Closure(this->_M_closure)); \
|
2002-08-03 01:08:40 +02:00
|
|
|
}
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2002-08-02 20:10:38 +02:00
|
|
|
_DEFINE_EXPR_UNARY_OPERATOR(+, __unary_plus)
|
|
|
|
_DEFINE_EXPR_UNARY_OPERATOR(-, __negate)
|
|
|
|
_DEFINE_EXPR_UNARY_OPERATOR(~, __bitwise_not)
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
#undef _DEFINE_EXPR_UNARY_OPERATOR
|
|
|
|
|
|
|
|
#define _DEFINE_EXPR_BINARY_OPERATOR(_Op, _Name) \
|
2002-08-03 01:08:40 +02:00
|
|
|
template<class _Dom1, class _Dom2> \
|
2004-07-08 22:48:04 +02:00
|
|
|
inline _Expr<_BinClos<_Name, _Expr, _Expr, _Dom1, _Dom2>, \
|
|
|
|
typename __fun<_Name, typename _Dom1::value_type>::result_type> \
|
|
|
|
operator _Op(const _Expr<_Dom1, typename _Dom1::value_type>& __v, \
|
|
|
|
const _Expr<_Dom2, typename _Dom2::value_type>& __w) \
|
|
|
|
{ \
|
|
|
|
typedef typename _Dom1::value_type _Arg; \
|
|
|
|
typedef typename __fun<_Name, _Arg>::result_type _Value; \
|
|
|
|
typedef _BinClos<_Name, _Expr, _Expr, _Dom1, _Dom2> _Closure; \
|
|
|
|
return _Expr<_Closure, _Value>(_Closure(__v(), __w())); \
|
|
|
|
} \
|
2000-10-05 13:27:02 +02:00
|
|
|
\
|
2004-07-08 22:48:04 +02:00
|
|
|
template<class _Dom> \
|
|
|
|
inline _Expr<_BinClos<_Name, _Expr, _Constant, _Dom, \
|
|
|
|
typename _Dom::value_type>, \
|
|
|
|
typename __fun<_Name, typename _Dom::value_type>::result_type> \
|
|
|
|
operator _Op(const _Expr<_Dom, typename _Dom::value_type>& __v, \
|
|
|
|
const typename _Dom::value_type& __t) \
|
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Arg; \
|
|
|
|
typedef typename __fun<_Name, _Arg>::result_type _Value; \
|
|
|
|
typedef _BinClos<_Name, _Expr, _Constant, _Dom, _Arg> _Closure; \
|
|
|
|
return _Expr<_Closure, _Value>(_Closure(__v(), __t)); \
|
|
|
|
} \
|
2000-10-05 13:27:02 +02:00
|
|
|
\
|
2004-07-08 22:48:04 +02:00
|
|
|
template<class _Dom> \
|
|
|
|
inline _Expr<_BinClos<_Name, _Constant, _Expr, \
|
|
|
|
typename _Dom::value_type, _Dom>, \
|
|
|
|
typename __fun<_Name, typename _Dom::value_type>::result_type> \
|
|
|
|
operator _Op(const typename _Dom::value_type& __t, \
|
|
|
|
const _Expr<_Dom, typename _Dom::value_type>& __v) \
|
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Arg; \
|
|
|
|
typedef typename __fun<_Name, _Arg>::result_type _Value; \
|
|
|
|
typedef _BinClos<_Name, _Constant, _Expr, _Arg, _Dom> _Closure; \
|
|
|
|
return _Expr<_Closure, _Value>(_Closure(__t, __v())); \
|
|
|
|
} \
|
2000-10-05 13:27:02 +02:00
|
|
|
\
|
2004-07-08 22:48:04 +02:00
|
|
|
template<class _Dom> \
|
|
|
|
inline _Expr<_BinClos<_Name, _Expr, _ValArray, \
|
|
|
|
_Dom, typename _Dom::value_type>, \
|
|
|
|
typename __fun<_Name, typename _Dom::value_type>::result_type> \
|
|
|
|
operator _Op(const _Expr<_Dom,typename _Dom::value_type>& __e, \
|
|
|
|
const valarray<typename _Dom::value_type>& __v) \
|
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Arg; \
|
|
|
|
typedef typename __fun<_Name, _Arg>::result_type _Value; \
|
|
|
|
typedef _BinClos<_Name, _Expr, _ValArray, _Dom, _Arg> _Closure; \
|
|
|
|
return _Expr<_Closure, _Value>(_Closure(__e(), __v)); \
|
|
|
|
} \
|
2000-10-05 13:27:02 +02:00
|
|
|
\
|
2004-07-08 22:48:04 +02:00
|
|
|
template<class _Dom> \
|
|
|
|
inline _Expr<_BinClos<_Name, _ValArray, _Expr, \
|
|
|
|
typename _Dom::value_type, _Dom>, \
|
|
|
|
typename __fun<_Name, typename _Dom::value_type>::result_type> \
|
|
|
|
operator _Op(const valarray<typename _Dom::value_type>& __v, \
|
|
|
|
const _Expr<_Dom, typename _Dom::value_type>& __e) \
|
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Tp; \
|
|
|
|
typedef typename __fun<_Name, _Tp>::result_type _Value; \
|
|
|
|
typedef _BinClos<_Name, _ValArray, _Expr, _Tp, _Dom> _Closure; \
|
|
|
|
return _Expr<_Closure, _Value>(_Closure(__v, __e ())); \
|
|
|
|
}
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2002-08-03 01:08:40 +02:00
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(+, __plus)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(-, __minus)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(*, __multiplies)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(/, __divides)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(%, __modulus)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(^, __bitwise_xor)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(&, __bitwise_and)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(|, __bitwise_or)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(<<, __shift_left)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(>>, __shift_right)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(&&, __logical_and)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(||, __logical_or)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(==, __equal_to)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(!=, __not_equal_to)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(<, __less)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(>, __greater)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(<=, __less_equal)
|
|
|
|
_DEFINE_EXPR_BINARY_OPERATOR(>=, __greater_equal)
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
#undef _DEFINE_EXPR_BINARY_OPERATOR
|
|
|
|
|
2010-02-06 21:41:09 +01:00
|
|
|
#define _DEFINE_EXPR_UNARY_FUNCTION(_Name, _UName) \
|
2002-08-03 01:08:40 +02:00
|
|
|
template<class _Dom> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_UnClos<_UName, _Expr, _Dom>, \
|
2004-07-08 22:48:04 +02:00
|
|
|
typename _Dom::value_type> \
|
|
|
|
_Name(const _Expr<_Dom, typename _Dom::value_type>& __e) \
|
2002-08-03 01:08:40 +02:00
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Tp; \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _UnClos<_UName, _Expr, _Dom> _Closure; \
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__e())); \
|
2002-08-03 01:08:40 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
template<typename _Tp> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_UnClos<_UName, _ValArray, _Tp>, _Tp> \
|
2002-08-03 01:08:40 +02:00
|
|
|
_Name(const valarray<_Tp>& __v) \
|
|
|
|
{ \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _UnClos<_UName, _ValArray, _Tp> _Closure; \
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__v)); \
|
2002-08-03 01:08:40 +02:00
|
|
|
}
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2010-02-06 21:41:09 +01:00
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(abs, _Abs)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(cos, _Cos)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(acos, _Acos)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(cosh, _Cosh)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(sin, _Sin)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(asin, _Asin)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(sinh, _Sinh)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(tan, _Tan)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(tanh, _Tanh)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(atan, _Atan)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(exp, _Exp)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(log, _Log)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(log10, _Log10)
|
|
|
|
_DEFINE_EXPR_UNARY_FUNCTION(sqrt, _Sqrt)
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
#undef _DEFINE_EXPR_UNARY_FUNCTION
|
|
|
|
|
2010-02-06 21:41:09 +01:00
|
|
|
#define _DEFINE_EXPR_BINARY_FUNCTION(_Fun, _UFun) \
|
2002-08-03 01:08:40 +02:00
|
|
|
template<class _Dom1, class _Dom2> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_BinClos<_UFun, _Expr, _Expr, _Dom1, _Dom2>, \
|
2002-08-03 01:08:40 +02:00
|
|
|
typename _Dom1::value_type> \
|
2004-07-08 22:48:04 +02:00
|
|
|
_Fun(const _Expr<_Dom1, typename _Dom1::value_type>& __e1, \
|
2010-02-06 21:41:09 +01:00
|
|
|
const _Expr<_Dom2, typename _Dom2::value_type>& __e2) \
|
2002-08-03 01:08:40 +02:00
|
|
|
{ \
|
|
|
|
typedef typename _Dom1::value_type _Tp; \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _BinClos<_UFun, _Expr, _Expr, _Dom1, _Dom2> _Closure; \
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__e1(), __e2())); \
|
2002-08-03 01:08:40 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
template<class _Dom> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_BinClos<_UFun, _Expr, _ValArray, _Dom, \
|
2002-08-03 01:08:40 +02:00
|
|
|
typename _Dom::value_type>, \
|
|
|
|
typename _Dom::value_type> \
|
2004-07-08 22:48:04 +02:00
|
|
|
_Fun(const _Expr<_Dom, typename _Dom::value_type>& __e, \
|
2002-08-03 01:08:40 +02:00
|
|
|
const valarray<typename _Dom::value_type>& __v) \
|
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Tp; \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _BinClos<_UFun, _Expr, _ValArray, _Dom, _Tp> _Closure; \
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__e(), __v)); \
|
2002-08-03 01:08:40 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
template<class _Dom> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_BinClos<_UFun, _ValArray, _Expr, \
|
2004-07-08 22:48:04 +02:00
|
|
|
typename _Dom::value_type, _Dom>, \
|
2002-08-03 01:08:40 +02:00
|
|
|
typename _Dom::value_type> \
|
|
|
|
_Fun(const valarray<typename _Dom::valarray>& __v, \
|
2004-07-08 22:48:04 +02:00
|
|
|
const _Expr<_Dom, typename _Dom::value_type>& __e) \
|
2002-08-03 01:08:40 +02:00
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Tp; \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _BinClos<_UFun, _ValArray, _Expr, _Tp, _Dom> _Closure; \
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__v, __e())); \
|
2002-08-03 01:08:40 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
template<class _Dom> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_BinClos<_UFun, _Expr, _Constant, _Dom, \
|
2002-08-03 01:08:40 +02:00
|
|
|
typename _Dom::value_type>, \
|
|
|
|
typename _Dom::value_type> \
|
|
|
|
_Fun(const _Expr<_Dom, typename _Dom::value_type>& __e, \
|
|
|
|
const typename _Dom::value_type& __t) \
|
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Tp; \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _BinClos<_UFun, _Expr, _Constant, _Dom, _Tp> _Closure; \
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__e(), __t)); \
|
2002-08-03 01:08:40 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
template<class _Dom> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_BinClos<_UFun, _Constant, _Expr, \
|
2004-07-08 22:48:04 +02:00
|
|
|
typename _Dom::value_type, _Dom>, \
|
2002-08-03 01:08:40 +02:00
|
|
|
typename _Dom::value_type> \
|
|
|
|
_Fun(const typename _Dom::value_type& __t, \
|
2004-07-08 22:48:04 +02:00
|
|
|
const _Expr<_Dom, typename _Dom::value_type>& __e) \
|
2002-08-03 01:08:40 +02:00
|
|
|
{ \
|
|
|
|
typedef typename _Dom::value_type _Tp; \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _BinClos<_UFun, _Constant, _Expr, _Tp, _Dom> _Closure; \
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__t, __e())); \
|
2002-08-03 01:08:40 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
template<typename _Tp> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_BinClos<_UFun, _ValArray, _ValArray, _Tp, _Tp>, _Tp> \
|
2002-08-03 01:08:40 +02:00
|
|
|
_Fun(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \
|
|
|
|
{ \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _BinClos<_UFun, _ValArray, _ValArray, _Tp, _Tp> _Closure;\
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__v, __w)); \
|
2002-08-03 01:08:40 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
template<typename _Tp> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_BinClos<_UFun, _ValArray, _Constant, _Tp, _Tp>, _Tp> \
|
2018-06-14 21:36:54 +02:00
|
|
|
_Fun(const valarray<_Tp>& __v, \
|
|
|
|
const typename valarray<_Tp>::value_type& __t) \
|
2002-08-03 01:08:40 +02:00
|
|
|
{ \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _BinClos<_UFun, _ValArray, _Constant, _Tp, _Tp> _Closure;\
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__v, __t)); \
|
2002-08-03 01:08:40 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
template<typename _Tp> \
|
2010-02-06 21:41:09 +01:00
|
|
|
inline _Expr<_BinClos<_UFun, _Constant, _ValArray, _Tp, _Tp>, _Tp> \
|
2018-06-14 21:36:54 +02:00
|
|
|
_Fun(const typename valarray<_Tp>::value_type& __t, \
|
|
|
|
const valarray<_Tp>& __v) \
|
2002-08-03 01:08:40 +02:00
|
|
|
{ \
|
2010-02-06 21:41:09 +01:00
|
|
|
typedef _BinClos<_UFun, _Constant, _ValArray, _Tp, _Tp> _Closure;\
|
2004-07-08 22:48:04 +02:00
|
|
|
return _Expr<_Closure, _Tp>(_Closure(__t, __v)); \
|
2002-08-03 01:08:40 +02:00
|
|
|
}
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2010-02-06 21:41:09 +01:00
|
|
|
_DEFINE_EXPR_BINARY_FUNCTION(atan2, _Atan2)
|
|
|
|
_DEFINE_EXPR_BINARY_FUNCTION(pow, _Pow)
|
2000-10-05 13:27:02 +02:00
|
|
|
|
|
|
|
#undef _DEFINE_EXPR_BINARY_FUNCTION
|
|
|
|
|
PR libstdc++/36104 part four
2011-01-30 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/36104 part four
* include/bits/c++config (_GLIBCXX_STD): Remove.
(_GLIBCXX_STD_D, _GLIBCXX_PR): Now _GLIBCXX_STD_C.
(_GLIBCXX_P): Now _GLIBCXX_STD_A.
(_GLIBCXX_NAMESPACE_DEBUG, _GLIBCXX_NAMESPACE_PARALLEL,
_GLIBCXX_NAMESPACE_PROFILE, _GLIBCXX_NAMESPACE_VERSION): Remove.
(_GLIBCXX_INLINE_DEBUG, _GLIBCXX_INLINE_PARALLEL,
_GLIBCXX_INLINE_PROFILE): Remove.
(_GLIBCXX_BEGIN_NAMESPACE(X)): Remove.
(_GLIBCXX_END_NAMESPACE): Remove.
(_GLIBCXX_BEGIN_NESTED_NAMESPACE(X, Y)): Remove.
(_GLIBCXX_END_NESTED_NAMESPACE): Remove.
(_GLIBCXX_BEGIN_NAMESPACE_ALGO): Add.
(_GLIBCXX_END_NAMESPACE_ALGO): Add.
(_GLIBCXX_BEGIN_NAMESPACE_CONTAINER): Add.
(_GLIBCXX_END_NAMESPACE_CONTAINER): Add.
(_GLIBCXX_BEGIN_NAMESPACE_VERSION): Add.
(_GLIBCXX_END_NAMESPACE_VERSION): Add.
(_GLIBCXX_BEGIN_LDBL_NAMESPACE): To _GLIBCXX_BEGIN_NAMESPACE_LDBL.
(_GLIBCXX_END_LDBL_NAMESPACE): To _GLIBCXX_END_NAMESPACE_LDBL.
(_GLIBCXX_VISIBILITY_ATTR): Revert to _GLIBCXX_VISIBILITY.
* include/*: Use new macros for namespace scope.
* config/*: Same.
* src/*: Same.
* src/Makefile.am (sources): Remove debug_list.cc, add
compatibility-debug_list-2.cc.
(parallel_sources): Remove parallel_list.cc, add
compatibility-parallel_list-2.cc.
(compatibility-parallel_list-2.[o,lo]): New rule.
* src/Makefile.in: Regenerate.
* src/debug_list.cc: Remove.
* src/parallel_list.cc: Remove.
* src/compatibility-list-2.cc: New.
* src/compatibility-debug_list-2.cc: New.
* src/compatibility-parallel_list-2.cc: New.
* doc/doxygen/user.cfg.in: Adjust macros.
* testsuite/20_util/auto_ptr/assign_neg.cc: Adjust line numbers, macros.
* testsuite/20_util/declval/requirements/1_neg.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg1.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg2.cc: Same.
* testsuite/20_util/duration/requirements/typedefs_neg3.cc: Same.
* testsuite/20_util/forward/c_neg.cc: Same.
* testsuite/20_util/forward/f_neg.cc: Same.
* testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Same.
* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Same.
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Same.
* testsuite/20_util/ratio/operations/ops_overflow_neg.cc: Same.
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Same.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Same.
* testsuite/23_containers/forward_list/capacity/1.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
assign_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/forward_list/requirements/dr438/
insert_neg.cc: Same.
* testsuite/23_containers/list/capacity/29134.cc: Same.
* testsuite/23_containers/list/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/list/requirements/dr438/insert_neg.cc: Same.
* testsuite/23_containers/vector/bool/capacity/29134.cc: Same.
* testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/
constructor_1_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/
constructor_2_neg.cc: Same.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Same.
* testsuite/25_algorithms/sort/35588.cc: Same.
* testsuite/27_io/ios_base/cons/assign_neg.cc: Same.
* testsuite/27_io/ios_base/cons/copy_neg.cc: Same.
* testsuite/ext/profile/mutex_extensions_neg.cc: Same.
* testsuite/ext/profile/profiler_algos.cc: Same.
* testsuite/ext/type_traits/add_unsigned_floating_neg.cc: Same.
* testsuite/ext/type_traits/add_unsigned_integer_neg.cc: Same.
* testsuite/ext/type_traits/remove_unsigned_floating_neg.cc: Same.
* testsuite/ext/type_traits/remove_unsigned_integer_neg.cc: Same.
* testsuite/tr1/2_general_utilities/shared_ptr/cons/43820_neg.cc: Same.
From-SVN: r169421
2011-01-30 23:39:36 +01:00
|
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
|
|
} // namespace
|
2000-10-05 13:27:02 +02:00
|
|
|
|
2003-01-24 17:32:11 +01:00
|
|
|
#endif /* _CPP_VALARRAY_AFTER_H */
|