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