1*e4b17023SJohn Marino // The template and inlines for the -*- C++ -*- internal _Array helper class. 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino // Copyright (C) 1997, 1998, 1999, 2003, 2005, 2009, 2010 4*e4b17023SJohn Marino // Free Software Foundation, Inc. 5*e4b17023SJohn Marino // 6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino // any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino // GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino /** @file bits/valarray_array.tcc 27*e4b17023SJohn Marino * This is an internal header file, included by other library headers. 28*e4b17023SJohn Marino * Do not attempt to use it directly. @headername{valarray} 29*e4b17023SJohn Marino */ 30*e4b17023SJohn Marino 31*e4b17023SJohn Marino // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr> 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino #ifndef _VALARRAY_ARRAY_TCC 34*e4b17023SJohn Marino #define _VALARRAY_ARRAY_TCC 1 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default) 37*e4b17023SJohn Marino { 38*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 39*e4b17023SJohn Marino 40*e4b17023SJohn Marino template<typename _Tp> 41*e4b17023SJohn Marino void __valarray_fill(_Array<_Tp> __a,size_t __n,_Array<bool> __m,const _Tp & __t)42*e4b17023SJohn Marino __valarray_fill(_Array<_Tp> __a, size_t __n, _Array<bool> __m, 43*e4b17023SJohn Marino const _Tp& __t) 44*e4b17023SJohn Marino { 45*e4b17023SJohn Marino _Tp* __p = __a._M_data; 46*e4b17023SJohn Marino bool* __ok (__m._M_data); 47*e4b17023SJohn Marino for (size_t __i=0; __i < __n; ++__i, ++__ok, ++__p) 48*e4b17023SJohn Marino { 49*e4b17023SJohn Marino while (!*__ok) 50*e4b17023SJohn Marino { 51*e4b17023SJohn Marino ++__ok; 52*e4b17023SJohn Marino ++__p; 53*e4b17023SJohn Marino } 54*e4b17023SJohn Marino *__p = __t; 55*e4b17023SJohn Marino } 56*e4b17023SJohn Marino } 57*e4b17023SJohn Marino 58*e4b17023SJohn Marino // Copy n elements of a into consecutive elements of b. When m is 59*e4b17023SJohn Marino // false, the corresponding element of a is skipped. m must contain 60*e4b17023SJohn Marino // at least n true elements. a must contain at least n elements and 61*e4b17023SJohn Marino // enough elements to match up with m through the nth true element 62*e4b17023SJohn Marino // of m. I.e. if n is 10, m has 15 elements with 5 false followed 63*e4b17023SJohn Marino // by 10 true, a must have 15 elements. 64*e4b17023SJohn Marino template<typename _Tp> 65*e4b17023SJohn Marino void __valarray_copy(_Array<_Tp> __a,_Array<bool> __m,_Array<_Tp> __b,size_t __n)66*e4b17023SJohn Marino __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, _Array<_Tp> __b, 67*e4b17023SJohn Marino size_t __n) 68*e4b17023SJohn Marino { 69*e4b17023SJohn Marino _Tp* __p (__a._M_data); 70*e4b17023SJohn Marino bool* __ok (__m._M_data); 71*e4b17023SJohn Marino for (_Tp* __q = __b._M_data; __q < __b._M_data + __n; 72*e4b17023SJohn Marino ++__q, ++__ok, ++__p) 73*e4b17023SJohn Marino { 74*e4b17023SJohn Marino while (! *__ok) 75*e4b17023SJohn Marino { 76*e4b17023SJohn Marino ++__ok; 77*e4b17023SJohn Marino ++__p; 78*e4b17023SJohn Marino } 79*e4b17023SJohn Marino *__q = *__p; 80*e4b17023SJohn Marino } 81*e4b17023SJohn Marino } 82*e4b17023SJohn Marino 83*e4b17023SJohn Marino // Copy n consecutive elements from a into elements of b. Elements 84*e4b17023SJohn Marino // of b are skipped if the corresponding element of m is false. m 85*e4b17023SJohn Marino // must contain at least n true elements. b must have at least as 86*e4b17023SJohn Marino // many elements as the index of the nth true element of m. I.e. if 87*e4b17023SJohn Marino // m has 15 elements with 5 false followed by 10 true, b must have 88*e4b17023SJohn Marino // at least 15 elements. 89*e4b17023SJohn Marino template<typename _Tp> 90*e4b17023SJohn Marino void __valarray_copy(_Array<_Tp> __a,size_t __n,_Array<_Tp> __b,_Array<bool> __m)91*e4b17023SJohn Marino __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b, 92*e4b17023SJohn Marino _Array<bool> __m) 93*e4b17023SJohn Marino { 94*e4b17023SJohn Marino _Tp* __q (__b._M_data); 95*e4b17023SJohn Marino bool* __ok (__m._M_data); 96*e4b17023SJohn Marino for (_Tp* __p = __a._M_data; __p < __a._M_data+__n; 97*e4b17023SJohn Marino ++__p, ++__ok, ++__q) 98*e4b17023SJohn Marino { 99*e4b17023SJohn Marino while (! *__ok) 100*e4b17023SJohn Marino { 101*e4b17023SJohn Marino ++__ok; 102*e4b17023SJohn Marino ++__q; 103*e4b17023SJohn Marino } 104*e4b17023SJohn Marino *__q = *__p; 105*e4b17023SJohn Marino } 106*e4b17023SJohn Marino } 107*e4b17023SJohn Marino 108*e4b17023SJohn Marino // Copy n elements from a into elements of b. Elements of a are 109*e4b17023SJohn Marino // skipped if the corresponding element of m is false. Elements of 110*e4b17023SJohn Marino // b are skipped if the corresponding element of k is false. m and 111*e4b17023SJohn Marino // k must contain at least n true elements. a and b must have at 112*e4b17023SJohn Marino // least as many elements as the index of the nth true element of m. 113*e4b17023SJohn Marino template<typename _Tp> 114*e4b17023SJohn Marino void __valarray_copy(_Array<_Tp> __a,_Array<bool> __m,size_t __n,_Array<_Tp> __b,_Array<bool> __k)115*e4b17023SJohn Marino __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, size_t __n, 116*e4b17023SJohn Marino _Array<_Tp> __b, _Array<bool> __k) 117*e4b17023SJohn Marino { 118*e4b17023SJohn Marino _Tp* __p (__a._M_data); 119*e4b17023SJohn Marino _Tp* __q (__b._M_data); 120*e4b17023SJohn Marino bool* __srcok (__m._M_data); 121*e4b17023SJohn Marino bool* __dstok (__k._M_data); 122*e4b17023SJohn Marino for (size_t __i = 0; __i < __n; 123*e4b17023SJohn Marino ++__srcok, ++__p, ++__dstok, ++__q, ++__i) 124*e4b17023SJohn Marino { 125*e4b17023SJohn Marino while (! *__srcok) 126*e4b17023SJohn Marino { 127*e4b17023SJohn Marino ++__srcok; 128*e4b17023SJohn Marino ++__p; 129*e4b17023SJohn Marino } 130*e4b17023SJohn Marino while (! *__dstok) 131*e4b17023SJohn Marino { 132*e4b17023SJohn Marino ++__dstok; 133*e4b17023SJohn Marino ++__q; 134*e4b17023SJohn Marino } 135*e4b17023SJohn Marino *__q = *__p; 136*e4b17023SJohn Marino } 137*e4b17023SJohn Marino } 138*e4b17023SJohn Marino 139*e4b17023SJohn Marino // Copy n consecutive elements of e into consecutive elements of a. 140*e4b17023SJohn Marino // I.e. a[i] = e[i]. 141*e4b17023SJohn Marino template<typename _Tp, class _Dom> 142*e4b17023SJohn Marino void __valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a)143*e4b17023SJohn Marino __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, _Array<_Tp> __a) 144*e4b17023SJohn Marino { 145*e4b17023SJohn Marino _Tp* __p (__a._M_data); 146*e4b17023SJohn Marino for (size_t __i = 0; __i < __n; ++__i, ++__p) 147*e4b17023SJohn Marino *__p = __e[__i]; 148*e4b17023SJohn Marino } 149*e4b17023SJohn Marino 150*e4b17023SJohn Marino // Copy n consecutive elements of e into elements of a using stride 151*e4b17023SJohn Marino // s. I.e., a[0] = e[0], a[s] = e[1], a[2*s] = e[2]. 152*e4b17023SJohn Marino template<typename _Tp, class _Dom> 153*e4b17023SJohn Marino void __valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,size_t __s)154*e4b17023SJohn Marino __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 155*e4b17023SJohn Marino _Array<_Tp> __a, size_t __s) 156*e4b17023SJohn Marino { 157*e4b17023SJohn Marino _Tp* __p (__a._M_data); 158*e4b17023SJohn Marino for (size_t __i = 0; __i < __n; ++__i, __p += __s) 159*e4b17023SJohn Marino *__p = __e[__i]; 160*e4b17023SJohn Marino } 161*e4b17023SJohn Marino 162*e4b17023SJohn Marino // Copy n consecutive elements of e into elements of a indexed by 163*e4b17023SJohn Marino // contents of i. I.e., a[i[0]] = e[0]. 164*e4b17023SJohn Marino template<typename _Tp, class _Dom> 165*e4b17023SJohn Marino void __valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,_Array<size_t> __i)166*e4b17023SJohn Marino __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 167*e4b17023SJohn Marino _Array<_Tp> __a, _Array<size_t> __i) 168*e4b17023SJohn Marino { 169*e4b17023SJohn Marino size_t* __j (__i._M_data); 170*e4b17023SJohn Marino for (size_t __k = 0; __k < __n; ++__k, ++__j) 171*e4b17023SJohn Marino __a._M_data[*__j] = __e[__k]; 172*e4b17023SJohn Marino } 173*e4b17023SJohn Marino 174*e4b17023SJohn Marino // Copy n elements of e indexed by contents of f into elements of a 175*e4b17023SJohn Marino // indexed by contents of i. I.e., a[i[0]] = e[f[0]]. 176*e4b17023SJohn Marino template<typename _Tp> 177*e4b17023SJohn Marino void __valarray_copy(_Array<_Tp> __e,_Array<size_t> __f,size_t __n,_Array<_Tp> __a,_Array<size_t> __i)178*e4b17023SJohn Marino __valarray_copy(_Array<_Tp> __e, _Array<size_t> __f, 179*e4b17023SJohn Marino size_t __n, 180*e4b17023SJohn Marino _Array<_Tp> __a, _Array<size_t> __i) 181*e4b17023SJohn Marino { 182*e4b17023SJohn Marino size_t* __g (__f._M_data); 183*e4b17023SJohn Marino size_t* __j (__i._M_data); 184*e4b17023SJohn Marino for (size_t __k = 0; __k < __n; ++__k, ++__j, ++__g) 185*e4b17023SJohn Marino __a._M_data[*__j] = __e._M_data[*__g]; 186*e4b17023SJohn Marino } 187*e4b17023SJohn Marino 188*e4b17023SJohn Marino // Copy n consecutive elements of e into elements of a. Elements of 189*e4b17023SJohn Marino // a are skipped if the corresponding element of m is false. m must 190*e4b17023SJohn Marino // have at least n true elements and a must have at least as many 191*e4b17023SJohn Marino // elements as the index of the nth true element of m. I.e. if m 192*e4b17023SJohn Marino // has 5 false followed by 10 true elements and n == 10, a must have 193*e4b17023SJohn Marino // at least 15 elements. 194*e4b17023SJohn Marino template<typename _Tp, class _Dom> 195*e4b17023SJohn Marino void __valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,_Array<bool> __m)196*e4b17023SJohn Marino __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 197*e4b17023SJohn Marino _Array<_Tp> __a, _Array<bool> __m) 198*e4b17023SJohn Marino { 199*e4b17023SJohn Marino bool* __ok (__m._M_data); 200*e4b17023SJohn Marino _Tp* __p (__a._M_data); 201*e4b17023SJohn Marino for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p) 202*e4b17023SJohn Marino { 203*e4b17023SJohn Marino while (! *__ok) 204*e4b17023SJohn Marino { 205*e4b17023SJohn Marino ++__ok; 206*e4b17023SJohn Marino ++__p; 207*e4b17023SJohn Marino } 208*e4b17023SJohn Marino *__p = __e[__i]; 209*e4b17023SJohn Marino } 210*e4b17023SJohn Marino } 211*e4b17023SJohn Marino 212*e4b17023SJohn Marino 213*e4b17023SJohn Marino template<typename _Tp, class _Dom> 214*e4b17023SJohn Marino void __valarray_copy_construct(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a)215*e4b17023SJohn Marino __valarray_copy_construct(const _Expr<_Dom, _Tp>& __e, size_t __n, 216*e4b17023SJohn Marino _Array<_Tp> __a) 217*e4b17023SJohn Marino { 218*e4b17023SJohn Marino _Tp* __p (__a._M_data); 219*e4b17023SJohn Marino for (size_t __i = 0; __i < __n; ++__i, ++__p) 220*e4b17023SJohn Marino new (__p) _Tp(__e[__i]); 221*e4b17023SJohn Marino } 222*e4b17023SJohn Marino 223*e4b17023SJohn Marino 224*e4b17023SJohn Marino template<typename _Tp> 225*e4b17023SJohn Marino void __valarray_copy_construct(_Array<_Tp> __a,_Array<bool> __m,_Array<_Tp> __b,size_t __n)226*e4b17023SJohn Marino __valarray_copy_construct(_Array<_Tp> __a, _Array<bool> __m, 227*e4b17023SJohn Marino _Array<_Tp> __b, size_t __n) 228*e4b17023SJohn Marino { 229*e4b17023SJohn Marino _Tp* __p (__a._M_data); 230*e4b17023SJohn Marino bool* __ok (__m._M_data); 231*e4b17023SJohn Marino for (_Tp* __q = __b._M_data; __q < __b._M_data+__n; ++__q, ++__ok, ++__p) 232*e4b17023SJohn Marino { 233*e4b17023SJohn Marino while (! *__ok) 234*e4b17023SJohn Marino { 235*e4b17023SJohn Marino ++__ok; 236*e4b17023SJohn Marino ++__p; 237*e4b17023SJohn Marino } 238*e4b17023SJohn Marino new (__q) _Tp(*__p); 239*e4b17023SJohn Marino } 240*e4b17023SJohn Marino } 241*e4b17023SJohn Marino 242*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 243*e4b17023SJohn Marino } // namespace 244*e4b17023SJohn Marino 245*e4b17023SJohn Marino #endif /* _VALARRAY_ARRAY_TCC */ 246