111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The template and inlines for the -*- C++ -*- valarray class. 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 1997-2014 Free Software Foundation, Inc. 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library. This library is free 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option) 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful, 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details. 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation. 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program; 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>. 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file include/valarray 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is a Standard C++ Library header. 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr> 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _GLIBCXX_VALARRAY 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _GLIBCXX_VALARRAY 1 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#pragma GCC system_header 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/c++config.h> 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cmath> 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <algorithm> 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <debug/debug.h> 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <initializer_list> 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default) 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Clos, typename _Tp> 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _Expr; 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp1, typename _Tp2> 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _ValArray; 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Oper, template<class, class> class _Meta, class _Dom> 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _UnClos; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Oper, 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class, class> class _Meta1, 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class, class> class _Meta2, 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _Dom1, class _Dom2> 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _BinClos; 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<template<class, class> class _Meta, class _Dom> 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _SClos; 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<template<class, class> class _Meta, class _Dom> 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _GClos; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<template<class, class> class _Meta, class _Dom> 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _IClos; 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<template<class, class> class _Meta, class _Dom> 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _ValFunClos; 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<template<class, class> class _Meta, class _Dom> 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class _RefFunClos; 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> class valarray; // An array of type _Tp 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class slice; // BLAS-like slice out of an array 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> class slice_array; 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class gslice; // generalized slice out of an array 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> class gslice_array; 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> class mask_array; // masked array 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> class indirect_array; // indirected array 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/valarray_array.h> 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/valarray_before.h> 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default) 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @defgroup numeric_arrays Numeric Arrays 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup numerics 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Classes and functions for representing and manipulating arrays of elements. 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @{ 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Smart array designed to support numeric processing. 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * A valarray is an array that provides constraints intended to allow for 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * effective optimization of numeric array processing by reducing the 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * aliasing that can result from pointer representations. It represents a 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * one-dimensional array from which different multidimensional subsets can 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * be accessed and modified. 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @tparam _Tp Type of object in the array. 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class valarray 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Op> 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct _UnaryOp 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __fun<_Op, _Tp>::result_type __rt; 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt; 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Tp value_type; 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _lib.valarray.cons_ construct/destroy: 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an empty array. 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(); 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an array with @a n elements. 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit valarray(size_t); 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an array with @a n elements initialized to @a t. 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(const _Tp&, size_t); 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an array initialized to the first @a n elements of @a t. 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(const _Tp* __restrict__, size_t); 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Copy constructor. 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(const valarray&); 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Move constructor. 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(valarray&&) noexcept; 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an array with the same size and values in @a sa. 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(const slice_array<_Tp>&); 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an array with the same size and values in @a ga. 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(const gslice_array<_Tp>&); 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an array with the same size and values in @a ma. 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(const mask_array<_Tp>&); 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an array with the same size and values in @a ia. 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(const indirect_array<_Tp>&); 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Construct an array with an initializer_list of values. 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(initializer_list<_Tp>); 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray(const _Expr<_Dom, _Tp>& __e); 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~valarray() _GLIBCXX_NOEXCEPT; 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _lib.valarray.assign_ assignment: 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Assign elements to an array. 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Assign elements of array to values in @a v. 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __v Valarray to get values from. 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator=(const valarray<_Tp>& __v); 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Move assign elements to an array. 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Move assign elements of array to values in @a v. 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __v Valarray to get values from. 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator=(valarray<_Tp>&& __v) noexcept; 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Assign elements to a value. 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Assign all elements of array to @a t. 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __t Value for elements. 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator=(const _Tp& __t); 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Assign elements to an array subset. 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Assign elements of array to values in @a sa. Results are undefined 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * if @a sa does not have the same size as this array. 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __sa Array slice to get values from. 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator=(const slice_array<_Tp>& __sa); 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Assign elements to an array subset. 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Assign elements of array to values in @a ga. Results are undefined 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * if @a ga does not have the same size as this array. 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __ga Array slice to get values from. 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator=(const gslice_array<_Tp>& __ga); 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Assign elements to an array subset. 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Assign elements of array to values in @a ma. Results are undefined 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * if @a ma does not have the same size as this array. 22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __ma Array slice to get values from. 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator=(const mask_array<_Tp>& __ma); 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Assign elements to an array subset. 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Assign elements of array to values in @a ia. Results are undefined 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * if @a ia does not have the same size as this array. 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __ia Array slice to get values from. 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator=(const indirect_array<_Tp>& __ia); 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Assign elements to an initializer_list. 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Assign elements of array to values in @a __l. Results are undefined 24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * if @a __l does not have the same size as this array. 24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __l initializer_list to get values from. 24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray& operator=(initializer_list<_Tp> __l); 25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> valarray<_Tp>& 25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator= (const _Expr<_Dom, _Tp>&); 25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _lib.valarray.access_ element access: 25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Return a reference to the i'th array element. 25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __i Index of element to return. 26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Reference to the i'th element. 26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp& operator[](size_t __i); 26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _GLIBCXX_RESOLVE_LIB_DEFECTS 26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // 389. Const overload of valarray::operator[] returns by value. 26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const _Tp& operator[](size_t) const; 26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _lib.valarray.sub_ subset operations: 26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return an array subset. 27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a new valarray containing the elements of the array 27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * indicated by the slice argument. The new valarray has the same size 27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * as the input slice. @see slice. 27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The source slice. 27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray containing elements in @a __s. 27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Expr<_SClos<_ValArray, _Tp>, _Tp> operator[](slice __s) const; 28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return a reference to an array subset. 28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a new valarray containing the elements of the array 28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * indicated by the slice argument. The new valarray has the same size 28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * as the input slice. @see slice. 28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The source slice. 28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray containing elements in @a __s. 29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert slice_array<_Tp> operator[](slice __s); 29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return an array subset. 29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a slice_array referencing the elements of the array 29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * indicated by the slice argument. @see gslice. 29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The source slice. 30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Slice_array referencing elements indicated by @a __s. 30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Expr<_GClos<_ValArray, _Tp>, _Tp> operator[](const gslice& __s) const; 30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return a reference to an array subset. 30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a new valarray containing the elements of the array 30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * indicated by the gslice argument. The new valarray has 30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the same size as the input gslice. @see gslice. 31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __s The source gslice. 31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray containing elements in @a __s. 31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert gslice_array<_Tp> operator[](const gslice& __s); 31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return an array subset. 31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a new valarray containing the elements of the array 32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * indicated by the argument. The input is a valarray of bool which 32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * represents a bitmask indicating which elements should be copied into 32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the new valarray. Each element of the array is added to the return 32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * valarray if the corresponding element of the argument is true. 32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __m The valarray bitmask. 32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray containing elements indicated by @a __m. 32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp> operator[](const valarray<bool>& __m) const; 32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return a reference to an array subset. 33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a new mask_array referencing the elements of the array 33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * indicated by the argument. The input is a valarray of bool which 33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * represents a bitmask indicating which elements are part of the 33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * subset. Elements of the array are part of the subset if the 33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * corresponding element of the argument is true. 33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __m The valarray bitmask. 34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray containing elements indicated by @a __m. 34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert mask_array<_Tp> operator[](const valarray<bool>& __m); 34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return an array subset. 34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a new valarray containing the elements of the array 34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * indicated by the argument. The elements in the argument are 34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * interpreted as the indices of elements of this valarray to copy to 35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the return valarray. 35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __i The valarray element index list. 35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray containing elements in @a __s. 35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Expr<_IClos<_ValArray, _Tp>, _Tp> 35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator[](const valarray<size_t>& __i) const; 35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return a reference to an array subset. 36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns an indirect_array referencing the elements of the array 36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * indicated by the argument. The elements in the argument are 36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * interpreted as the indices of elements of this valarray to include 36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in the subset. The returned indirect_array refers to these 36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * elements. 36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __i The valarray element index list. 36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Indirect_array referencing elements in @a __i. 36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert indirect_array<_Tp> operator[](const valarray<size_t>& __i); 37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _lib.valarray.unary_ unary operators: 37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Return a new valarray by applying unary + to each element. 37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename _UnaryOp<__unary_plus>::_Rt operator+() const; 37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Return a new valarray by applying unary - to each element. 37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename _UnaryOp<__negate>::_Rt operator-() const; 37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Return a new valarray by applying unary ~ to each element. 38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename _UnaryOp<__bitwise_not>::_Rt operator~() const; 38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Return a new valarray by applying unary ! to each element. 38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename _UnaryOp<__logical_not>::_Rt operator!() const; 38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _lib.valarray.cassign_ computed assignment: 38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Multiply each element of array by @a t. 38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator*=(const _Tp&); 38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Divide each element of array by @a t. 39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator/=(const _Tp&); 39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Set each element e of array to e % @a t. 39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator%=(const _Tp&); 39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Add @a t to each element of array. 39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator+=(const _Tp&); 39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Subtract @a t to each element of array. 39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator-=(const _Tp&); 40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Set each element e of array to e ^ @a t. 40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator^=(const _Tp&); 40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Set each element e of array to e & @a t. 40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator&=(const _Tp&); 40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Set each element e of array to e | @a t. 40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator|=(const _Tp&); 40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Left shift each element e of array by @a t bits. 41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator<<=(const _Tp&); 41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Right shift each element e of array by @a t bits. 41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator>>=(const _Tp&); 41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Multiply elements of array by corresponding elements of @a v. 41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator*=(const valarray<_Tp>&); 41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Divide elements of array by corresponding elements of @a v. 42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator/=(const valarray<_Tp>&); 42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Modulo elements of array by corresponding elements of @a v. 42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator%=(const valarray<_Tp>&); 42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Add corresponding elements of @a v to elements of array. 42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator+=(const valarray<_Tp>&); 42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Subtract corresponding elements of @a v from elements of array. 42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator-=(const valarray<_Tp>&); 43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Logical xor corresponding elements of @a v with elements of array. 43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator^=(const valarray<_Tp>&); 43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Logical or corresponding elements of @a v with elements of array. 43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator|=(const valarray<_Tp>&); 43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Logical and corresponding elements of @a v with elements of array. 43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator&=(const valarray<_Tp>&); 43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Left shift elements of array by corresponding elements of @a v. 44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator<<=(const valarray<_Tp>&); 44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Right shift elements of array by corresponding elements of @a v. 44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator>>=(const valarray<_Tp>&); 44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator*=(const _Expr<_Dom, _Tp>&); 44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator/=(const _Expr<_Dom, _Tp>&); 45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator%=(const _Expr<_Dom, _Tp>&); 45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator+=(const _Expr<_Dom, _Tp>&); 45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator-=(const _Expr<_Dom, _Tp>&); 45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator^=(const _Expr<_Dom, _Tp>&); 45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator|=(const _Expr<_Dom, _Tp>&); 46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator&=(const _Expr<_Dom, _Tp>&); 46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator<<=(const _Expr<_Dom, _Tp>&); 46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Dom> 46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>& operator>>=(const _Expr<_Dom, _Tp>&); 46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _lib.valarray.members_ member functions: 46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Swap. 47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void swap(valarray<_Tp>& __v) noexcept; 47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Return the number of elements in array. 47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t size() const; 47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return the sum of all elements in the array. 47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Accumulates the sum of all elements into a Tp using +=. The order 48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * of adding the elements is unspecified. 48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp sum() const; 48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Return the minimum element using operator<(). 48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp min() const; 48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /// Return the maximum element using operator<(). 48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp max() const; 48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return a shifted array. 49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * A new valarray is constructed as a copy of this array with elements 49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in shifted positions. For an element with index i, the new position 49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * is i - n. The new valarray has the same size as the current one. 49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * New elements without a value are set to 0. Elements whose new 49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * position is outside the bounds of the array are discarded. 49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Positive arguments shift toward index 0, discarding elements [0, n). 50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Negative arguments discard elements from the top of the array. 50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __n Number of element positions to shift. 50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray with elements in shifted positions. 50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp> shift (int __n) const; 50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return a rotated array. 50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * A new valarray is constructed as a copy of this array with elements 51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in shifted positions. For an element with index i, the new position 51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * is (i - n) % size(). The new valarray has the same size as the 51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * current one. Elements that are shifted beyond the array bounds are 51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * shifted into the other end of the array. No elements are lost. 51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Positive arguments shift toward index 0, wrapping around the top. 51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Negative arguments shift towards the top, wrapping around to 0. 51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __n Number of element positions to rotate. 52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray with elements in shifted positions. 52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp> cshift(int __n) const; 52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Apply a function to the array. 52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a new valarray with elements assigned to the result of 52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * applying func to the corresponding element of this array. The new 52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * array has the same size as this one. 53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param func Function of Tp returning Tp to apply. 53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray with transformed elements. 53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(_Tp)) const; 53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Apply a function to the array. 53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns a new valarray with elements assigned to the result of 54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * applying func to the corresponding element of this array. The new 54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * array has the same size as this one. 54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param func Function of const Tp& returning Tp to apply. 54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return New valarray with transformed elements. 54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(const _Tp&)) const; 54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Resize array. 55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Resize this array to @a size and set all elements to @a c. All 55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * references and iterators are invalidated. 55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __size New array size. 55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __c New value for all elements. 55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void resize(size_t __size, _Tp __c = _Tp()); 55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private: 56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t _M_size; 56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp* __restrict__ _M_data; 56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert friend class _Array<_Tp>; 56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline const _Tp& 56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](size_t __i) const 56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __glibcxx_requires_subscript(__i); 57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_data[__i]; 57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Tp& 57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](size_t __i) 57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __glibcxx_requires_subscript(__i); 57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_data[__i]; 58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // @} group numeric_arrays 58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION 58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace 58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/valarray_after.h> 58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/slice_array.h> 58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/gslice.h> 59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/gslice_array.h> 59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/mask_array.h> 59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/indirect_array.h> 59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default) 59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION 59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @addtogroup numeric_arrays 60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @{ 60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray() : _M_size(0), _M_data(0) {} 60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(size_t __n) 61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { std::__valarray_default_construct(_M_data, _M_data + __n); } 61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(const _Tp& __t, size_t __n) 61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { std::__valarray_fill_construct(_M_data, _M_data + __n, __t); } 61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(const _Tp* __restrict__ __p, size_t __n) 62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(__p != 0 || __n == 0); 62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(__p, __p + __n, _M_data); 62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(const valarray<_Tp>& __v) 63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size)) 63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size, 63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data); } 63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(valarray<_Tp>&& __v) noexcept 63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__v._M_size), _M_data(__v._M_data) 64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __v._M_size = 0; 64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __v._M_data = 0; 64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(const slice_array<_Tp>& __sa) 64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz)) 65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct 65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data)); 65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(const gslice_array<_Tp>& __ga) 65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__ga._M_index.size()), 65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data(__valarray_get_storage<_Tp>(_M_size)) 66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct 66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (__ga._M_array, _Array<size_t>(__ga._M_index), 66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array<_Tp>(_M_data), _M_size); 66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(const mask_array<_Tp>& __ma) 66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz)) 67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct 67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size); 67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(const indirect_array<_Tp>& __ia) 67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz)) 67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct 68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size); 68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(initializer_list<_Tp> __l) 68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__l.size()), _M_data(__valarray_get_storage<_Tp>(__l.size())) 68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { std::__valarray_copy_construct(__l.begin(), __l.end(), _M_data); } 69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 69211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> template<class _Dom> 69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::valarray(const _Expr<_Dom, _Tp>& __e) 69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size)) 69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); } 69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline 70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::~valarray() _GLIBCXX_NOEXCEPT 70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_release_memory(_M_data); 70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(const valarray<_Tp>& __v) 70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _GLIBCXX_RESOLVE_LIB_DEFECTS 71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // 630. arrays of valarray. 71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_size == __v._M_size) 71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy(__v._M_data, _M_size, _M_data); 71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_data) 71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_release_memory(_M_data); 72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 72111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_size = __v._M_size; 72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data = __valarray_get_storage<_Tp>(_M_size); 72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size, 72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data); 72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 73111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(valarray<_Tp>&& __v) noexcept 73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 73411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_data) 73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 73711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_release_memory(_M_data); 73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_size = __v._M_size; 74011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data = __v._M_data; 74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __v._M_size = 0; 74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __v._M_data = 0; 74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 74411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 74811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(initializer_list<_Tp> __l) 74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _GLIBCXX_RESOLVE_LIB_DEFECTS 75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // 630. arrays of valarray. 75211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_size == __l.size()) 75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy(__l.begin(), __l.size(), _M_data); 75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 75511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_data) 75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 75811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_release_memory(_M_data); 76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_size = __l.size(); 76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data = __valarray_get_storage<_Tp>(_M_size); 76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(__l.begin(), __l.begin() + _M_size, 76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data); 76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 76811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 77211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(const _Tp& __t) 77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_fill(_M_data, _M_size, __t); 77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 77611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(const slice_array<_Tp>& __sa) 78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_size == __sa._M_sz); 78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy(__sa._M_array, __sa._M_sz, 78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __sa._M_stride, _Array<_Tp>(_M_data)); 78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(const gslice_array<_Tp>& __ga) 79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 79211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_size == __ga._M_index.size()); 79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index), 79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array<_Tp>(_M_data), _M_size); 79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(const mask_array<_Tp>& __ma) 80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_size == __ma._M_sz); 80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy(__ma._M_array, __ma._M_mask, 80411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array<_Tp>(_M_data), _M_size); 80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 80811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(const indirect_array<_Tp>& __ia) 81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_size == __ia._M_sz); 81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy(__ia._M_array, __ia._M_index, 81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array<_Tp>(_M_data), _M_size); 81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> template<class _Dom> 81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& 82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e) 82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // _GLIBCXX_RESOLVE_LIB_DEFECTS 82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // 630. arrays of valarray. 82411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_size == __e.size()) 82511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data)); 82611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 82711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 82811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_data) 82911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 83011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 83111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_release_memory(_M_data); 83211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 83311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_size = __e.size(); 83411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data = __valarray_get_storage<_Tp>(_M_size); 83511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); 83611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 83711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 83811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 83911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 84011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 84111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Expr<_SClos<_ValArray,_Tp>, _Tp> 84211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](slice __s) const 84311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 84411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _SClos<_ValArray,_Tp> _Closure; 84511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s)); 84611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 84711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 84811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 84911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline slice_array<_Tp> 85011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](slice __s) 85111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return slice_array<_Tp>(_Array<_Tp>(_M_data), __s); } 85211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 85311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 85411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Expr<_GClos<_ValArray,_Tp>, _Tp> 85511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](const gslice& __gs) const 85611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 85711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _GClos<_ValArray,_Tp> _Closure; 85811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Tp> 85911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index)); 86011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 86111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 86211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 86311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline gslice_array<_Tp> 86411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](const gslice& __gs) 86511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 86611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return gslice_array<_Tp> 86711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (_Array<_Tp>(_M_data), __gs._M_index->_M_index); 86811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 86911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 87011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 87111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp> 87211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](const valarray<bool>& __m) const 87311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 87411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t __s = 0; 87511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t __e = __m.size(); 87611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t __i=0; __i<__e; ++__i) 87711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__m[__i]) ++__s; 87811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return valarray<_Tp>(mask_array<_Tp>(_Array<_Tp>(_M_data), __s, 87911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array<bool> (__m))); 88011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 88111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 88211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 88311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline mask_array<_Tp> 88411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](const valarray<bool>& __m) 88511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 88611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t __s = 0; 88711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert size_t __e = __m.size(); 88811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for (size_t __i=0; __i<__e; ++__i) 88911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__m[__i]) ++__s; 89011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return mask_array<_Tp>(_Array<_Tp>(_M_data), __s, _Array<bool>(__m)); 89111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 89211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 89311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 89411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Expr<_IClos<_ValArray,_Tp>, _Tp> 89511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](const valarray<size_t>& __i) const 89611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 89711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _IClos<_ValArray,_Tp> _Closure; 89811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Tp>(_Closure(*this, __i)); 89911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 90011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 90111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 90211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline indirect_array<_Tp> 90311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator[](const valarray<size_t>& __i) 90411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 90511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return indirect_array<_Tp>(_Array<_Tp>(_M_data), __i.size(), 90611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array<size_t>(__i)); 90711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 90811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 90911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 91011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 91111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline void 91211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::swap(valarray<_Tp>& __v) noexcept 91311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 91411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::swap(_M_size, __v._M_size); 91511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::swap(_M_data, __v._M_data); 91611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 91711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 91811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 91911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 92011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline size_t 92111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::size() const 92211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_size; } 92311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 92411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 92511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Tp 92611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::sum() const 92711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 92811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_size > 0); 92911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return std::__valarray_sum(_M_data, _M_data + _M_size); 93011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 93111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 93211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 93311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp> 93411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::shift(int __n) const 93511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 93611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp> __ret; 93711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 93811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_size == 0) 93911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __ret; 94011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 94111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp* __restrict__ __tmp_M_data = 94211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_get_storage<_Tp>(_M_size); 94311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 94411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__n == 0) 94511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(_M_data, 94611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data + _M_size, __tmp_M_data); 94711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else if (__n > 0) // shift left 94811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 94911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (size_t(__n) > _M_size) 95011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __n = int(_M_size); 95111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 95211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(_M_data + __n, 95311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data + _M_size, __tmp_M_data); 95411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_default_construct(__tmp_M_data + _M_size - __n, 95511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __tmp_M_data + _M_size); 95611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 95711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else // shift right 95811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 95911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (-size_t(__n) > _M_size) 96011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __n = -int(_M_size); 96111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 96211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n, 96311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __tmp_M_data - __n); 96411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_default_construct(__tmp_M_data, 96511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __tmp_M_data - __n); 96611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 96711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 96811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __ret._M_size = _M_size; 96911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __ret._M_data = __tmp_M_data; 97011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __ret; 97111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 97211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 97311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 97411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp> 97511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::cshift(int __n) const 97611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 97711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp> __ret; 97811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 97911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_size == 0) 98011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __ret; 98111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 98211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Tp* __restrict__ __tmp_M_data = 98311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_get_storage<_Tp>(_M_size); 98411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 98511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (__n == 0) 98611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(_M_data, 98711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data + _M_size, __tmp_M_data); 98811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else if (__n > 0) // cshift left 98911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 99011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (size_t(__n) > _M_size) 99111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __n = int(__n % _M_size); 99211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 99311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(_M_data, _M_data + __n, 99411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __tmp_M_data + _M_size - __n); 99511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size, 99611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __tmp_M_data); 99711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 99811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else // cshift right 99911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 100011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (-size_t(__n) > _M_size) 100111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __n = -int(-size_t(__n) % _M_size); 100211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 100311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(_M_data + _M_size + __n, 100411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data + _M_size, __tmp_M_data); 100511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n, 100611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __tmp_M_data - __n); 100711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 100811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 100911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __ret._M_size = _M_size; 101011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __ret._M_data = __tmp_M_data; 101111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __ret; 101211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 101311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 101411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 101511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline void 101611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::resize(size_t __n, _Tp __c) 101711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 101811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // This complication is so to make valarray<valarray<T> > work 101911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // even though it is not required by the standard. Nobody should 102011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // be saying valarray<valarray<T> > anyway. See the specs. 102111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 102211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (_M_size != __n) 102311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 102411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_release_memory(_M_data); 102511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_size = __n; 102611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_data = __valarray_get_storage<_Tp>(__n); 102711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 102811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::__valarray_fill_construct(_M_data, _M_data + __n, __c); 102911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 103011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 103111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 103211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Tp 103311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::min() const 103411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 103511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_size > 0); 103611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *std::min_element(_M_data, _M_data + _M_size); 103711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 103811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 103911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> 104011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Tp 104111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::max() const 104211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 104311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_size > 0); 104411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *std::max_element(_M_data, _M_data + _M_size); 104511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 104611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 104711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 104811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> 104911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::apply(_Tp func(_Tp)) const 105011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 105111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _ValFunClos<_ValArray, _Tp> _Closure; 105211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Tp>(_Closure(*this, func)); 105311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 105411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 105511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 105611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> 105711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::apply(_Tp func(const _Tp &)) const 105811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 105911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _RefFunClos<_ValArray, _Tp> _Closure; 106011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Tp>(_Closure(*this, func)); 106111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 106211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 106311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \ 106411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> \ 106511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt \ 106611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator _Op() const \ 106711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { \ 106811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _UnClos<_Name, _ValArray, _Tp> _Closure; \ 106911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 107011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Rt>(_Closure(*this)); \ 107111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 107211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 107311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus) 107411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate) 107511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not) 107611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not) 107711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 107811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _DEFINE_VALARRAY_UNARY_OPERATOR 107911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 108011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \ 108111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> \ 108211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& \ 108311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator _Op##=(const _Tp &__t) \ 108411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { \ 108511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, __t); \ 108611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; \ 108711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } \ 108811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert \ 108911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> \ 109011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& \ 109111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v) \ 109211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { \ 109311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size); \ 109411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, \ 109511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array<_Tp>(__v._M_data)); \ 109611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; \ 109711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 109811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 109911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, __plus) 110011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, __minus) 110111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(*, __multiplies) 110211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(/, __divides) 110311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(%, __modulus) 110411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(^, __bitwise_xor) 110511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(&, __bitwise_and) 110611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(|, __bitwise_or) 110711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(<<, __shift_left) 110811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(>>, __shift_right) 110911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 111011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT 111111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 111211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name) \ 111311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> template<class _Dom> \ 111411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline valarray<_Tp>& \ 111511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert valarray<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) \ 111611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { \ 111711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _Array_augmented_##_Name(_Array<_Tp>(_M_data), __e, _M_size); \ 111811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; \ 111911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 112011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 112111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(+, __plus) 112211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(-, __minus) 112311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(*, __multiplies) 112411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(/, __divides) 112511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(%, __modulus) 112611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(^, __bitwise_xor) 112711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(&, __bitwise_and) 112811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(|, __bitwise_or) 112911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left) 113011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right) 113111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 113211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT 113311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 113411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 113511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEFINE_BINARY_OPERATOR(_Op, _Name) \ 113611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> \ 113711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>, \ 113811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename __fun<_Name, _Tp>::result_type> \ 113911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \ 114011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { \ 114111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _GLIBCXX_DEBUG_ASSERT(__v.size() == __w.size()); \ 114211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \ 114311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 114411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Rt>(_Closure(__v, __w)); \ 114511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } \ 114611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert \ 114711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> \ 114811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>, \ 114911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename __fun<_Name, _Tp>::result_type> \ 115011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator _Op(const valarray<_Tp>& __v, const _Tp& __t) \ 115111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { \ 115211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure; \ 115311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 115411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Rt>(_Closure(__v, __t)); \ 115511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } \ 115611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert \ 115711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Tp> \ 115811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>, \ 115911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename __fun<_Name, _Tp>::result_type> \ 116011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator _Op(const _Tp& __t, const valarray<_Tp>& __v) \ 116111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { \ 116211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \ 116311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 116411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _Expr<_Closure, _Rt>(_Closure(__t, __v)); \ 116511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 116611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 116711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(+, __plus) 116811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(-, __minus) 116911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(*, __multiplies) 117011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(/, __divides) 117111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(%, __modulus) 117211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(^, __bitwise_xor) 117311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(&, __bitwise_and) 117411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(|, __bitwise_or) 117511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(<<, __shift_left) 117611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(>>, __shift_right) 117711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(&&, __logical_and) 117811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(||, __logical_or) 117911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(==, __equal_to) 118011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(!=, __not_equal_to) 118111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(<, __less) 118211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(>, __greater) 118311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(<=, __less_equal) 118411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(>=, __greater_equal) 118511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 118611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _DEFINE_BINARY_OPERATOR 118711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 118811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L 118911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 119011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return an iterator pointing to the first element of 119111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the valarray. 119211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __va valarray. 119311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 119411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 119511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Tp* 119611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert begin(valarray<_Tp>& __va) 119711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return std::__addressof(__va[0]); } 119811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 119911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 120011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return an iterator pointing to the first element of 120111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the const valarray. 120211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __va valarray. 120311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 120411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 120511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline const _Tp* 120611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert begin(const valarray<_Tp>& __va) 120711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return std::__addressof(__va[0]); } 120811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 120911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 121011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return an iterator pointing to one past the last element of 121111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the valarray. 121211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __va valarray. 121311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 121411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 121511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline _Tp* 121611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert end(valarray<_Tp>& __va) 121711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return std::__addressof(__va[0]) + __va.size(); } 121811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 121911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 122011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Return an iterator pointing to one past the last element of 122111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * the const valarray. 122211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __va valarray. 122311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 122411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<class _Tp> 122511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline const _Tp* 122611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert end(const valarray<_Tp>& __va) 122711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return std::__addressof(__va[0]) + __va.size(); } 122811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // C++11 122911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 123011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // @} group numeric_arrays 123111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 123211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION 123311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace 123411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 123511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _GLIBCXX_VALARRAY */ 1236