11debfc3dSmrg // The template and inlines for the -*- C++ -*- internal _Array helper class. 21debfc3dSmrg 3*8feb0f0bSmrg // Copyright (C) 1997-2020 Free Software Foundation, Inc. 41debfc3dSmrg // 51debfc3dSmrg // This file is part of the GNU ISO C++ Library. This library is free 61debfc3dSmrg // software; you can redistribute it and/or modify it under the 71debfc3dSmrg // terms of the GNU General Public License as published by the 81debfc3dSmrg // Free Software Foundation; either version 3, or (at your option) 91debfc3dSmrg // any later version. 101debfc3dSmrg 111debfc3dSmrg // This library is distributed in the hope that it will be useful, 121debfc3dSmrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 131debfc3dSmrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141debfc3dSmrg // GNU General Public License for more details. 151debfc3dSmrg 161debfc3dSmrg // Under Section 7 of GPL version 3, you are granted additional 171debfc3dSmrg // permissions described in the GCC Runtime Library Exception, version 181debfc3dSmrg // 3.1, as published by the Free Software Foundation. 191debfc3dSmrg 201debfc3dSmrg // You should have received a copy of the GNU General Public License and 211debfc3dSmrg // a copy of the GCC Runtime Library Exception along with this program; 221debfc3dSmrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 231debfc3dSmrg // <http://www.gnu.org/licenses/>. 241debfc3dSmrg 251debfc3dSmrg /** @file bits/valarray_array.tcc 261debfc3dSmrg * This is an internal header file, included by other library headers. 271debfc3dSmrg * Do not attempt to use it directly. @headername{valarray} 281debfc3dSmrg */ 291debfc3dSmrg 301debfc3dSmrg // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr> 311debfc3dSmrg 321debfc3dSmrg #ifndef _VALARRAY_ARRAY_TCC 331debfc3dSmrg #define _VALARRAY_ARRAY_TCC 1 341debfc3dSmrg 351debfc3dSmrg namespace std _GLIBCXX_VISIBILITY(default) 361debfc3dSmrg { 371debfc3dSmrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 381debfc3dSmrg 391debfc3dSmrg template<typename _Tp> 401debfc3dSmrg void __valarray_fill(_Array<_Tp> __a,size_t __n,_Array<bool> __m,const _Tp & __t)411debfc3dSmrg __valarray_fill(_Array<_Tp> __a, size_t __n, _Array<bool> __m, 421debfc3dSmrg const _Tp& __t) 431debfc3dSmrg { 441debfc3dSmrg _Tp* __p = __a._M_data; 451debfc3dSmrg bool* __ok (__m._M_data); 461debfc3dSmrg for (size_t __i=0; __i < __n; ++__i, ++__ok, ++__p) 471debfc3dSmrg { 481debfc3dSmrg while (!*__ok) 491debfc3dSmrg { 501debfc3dSmrg ++__ok; 511debfc3dSmrg ++__p; 521debfc3dSmrg } 531debfc3dSmrg *__p = __t; 541debfc3dSmrg } 551debfc3dSmrg } 561debfc3dSmrg 571debfc3dSmrg // Copy n elements of a into consecutive elements of b. When m is 581debfc3dSmrg // false, the corresponding element of a is skipped. m must contain 591debfc3dSmrg // at least n true elements. a must contain at least n elements and 601debfc3dSmrg // enough elements to match up with m through the nth true element 611debfc3dSmrg // of m. I.e. if n is 10, m has 15 elements with 5 false followed 621debfc3dSmrg // by 10 true, a must have 15 elements. 631debfc3dSmrg template<typename _Tp> 641debfc3dSmrg void __valarray_copy(_Array<_Tp> __a,_Array<bool> __m,_Array<_Tp> __b,size_t __n)651debfc3dSmrg __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, _Array<_Tp> __b, 661debfc3dSmrg size_t __n) 671debfc3dSmrg { 681debfc3dSmrg _Tp* __p (__a._M_data); 691debfc3dSmrg bool* __ok (__m._M_data); 701debfc3dSmrg for (_Tp* __q = __b._M_data; __q < __b._M_data + __n; 711debfc3dSmrg ++__q, ++__ok, ++__p) 721debfc3dSmrg { 731debfc3dSmrg while (! *__ok) 741debfc3dSmrg { 751debfc3dSmrg ++__ok; 761debfc3dSmrg ++__p; 771debfc3dSmrg } 781debfc3dSmrg *__q = *__p; 791debfc3dSmrg } 801debfc3dSmrg } 811debfc3dSmrg 821debfc3dSmrg // Copy n consecutive elements from a into elements of b. Elements 831debfc3dSmrg // of b are skipped if the corresponding element of m is false. m 841debfc3dSmrg // must contain at least n true elements. b must have at least as 851debfc3dSmrg // many elements as the index of the nth true element of m. I.e. if 861debfc3dSmrg // m has 15 elements with 5 false followed by 10 true, b must have 871debfc3dSmrg // at least 15 elements. 881debfc3dSmrg template<typename _Tp> 891debfc3dSmrg void __valarray_copy(_Array<_Tp> __a,size_t __n,_Array<_Tp> __b,_Array<bool> __m)901debfc3dSmrg __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b, 911debfc3dSmrg _Array<bool> __m) 921debfc3dSmrg { 931debfc3dSmrg _Tp* __q (__b._M_data); 941debfc3dSmrg bool* __ok (__m._M_data); 951debfc3dSmrg for (_Tp* __p = __a._M_data; __p < __a._M_data+__n; 961debfc3dSmrg ++__p, ++__ok, ++__q) 971debfc3dSmrg { 981debfc3dSmrg while (! *__ok) 991debfc3dSmrg { 1001debfc3dSmrg ++__ok; 1011debfc3dSmrg ++__q; 1021debfc3dSmrg } 1031debfc3dSmrg *__q = *__p; 1041debfc3dSmrg } 1051debfc3dSmrg } 1061debfc3dSmrg 1071debfc3dSmrg // Copy n elements from a into elements of b. Elements of a are 1081debfc3dSmrg // skipped if the corresponding element of m is false. Elements of 1091debfc3dSmrg // b are skipped if the corresponding element of k is false. m and 1101debfc3dSmrg // k must contain at least n true elements. a and b must have at 1111debfc3dSmrg // least as many elements as the index of the nth true element of m. 1121debfc3dSmrg template<typename _Tp> 1131debfc3dSmrg void __valarray_copy(_Array<_Tp> __a,_Array<bool> __m,size_t __n,_Array<_Tp> __b,_Array<bool> __k)1141debfc3dSmrg __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, size_t __n, 1151debfc3dSmrg _Array<_Tp> __b, _Array<bool> __k) 1161debfc3dSmrg { 1171debfc3dSmrg _Tp* __p (__a._M_data); 1181debfc3dSmrg _Tp* __q (__b._M_data); 1191debfc3dSmrg bool* __srcok (__m._M_data); 1201debfc3dSmrg bool* __dstok (__k._M_data); 1211debfc3dSmrg for (size_t __i = 0; __i < __n; 1221debfc3dSmrg ++__srcok, ++__p, ++__dstok, ++__q, ++__i) 1231debfc3dSmrg { 1241debfc3dSmrg while (! *__srcok) 1251debfc3dSmrg { 1261debfc3dSmrg ++__srcok; 1271debfc3dSmrg ++__p; 1281debfc3dSmrg } 1291debfc3dSmrg while (! *__dstok) 1301debfc3dSmrg { 1311debfc3dSmrg ++__dstok; 1321debfc3dSmrg ++__q; 1331debfc3dSmrg } 1341debfc3dSmrg *__q = *__p; 1351debfc3dSmrg } 1361debfc3dSmrg } 1371debfc3dSmrg 1381debfc3dSmrg // Copy n consecutive elements of e into consecutive elements of a. 1391debfc3dSmrg // I.e. a[i] = e[i]. 1401debfc3dSmrg template<typename _Tp, class _Dom> 1411debfc3dSmrg void __valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a)1421debfc3dSmrg __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, _Array<_Tp> __a) 1431debfc3dSmrg { 1441debfc3dSmrg _Tp* __p (__a._M_data); 1451debfc3dSmrg for (size_t __i = 0; __i < __n; ++__i, ++__p) 1461debfc3dSmrg *__p = __e[__i]; 1471debfc3dSmrg } 1481debfc3dSmrg 1491debfc3dSmrg // Copy n consecutive elements of e into elements of a using stride 1501debfc3dSmrg // s. I.e., a[0] = e[0], a[s] = e[1], a[2*s] = e[2]. 1511debfc3dSmrg template<typename _Tp, class _Dom> 1521debfc3dSmrg void __valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,size_t __s)1531debfc3dSmrg __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 1541debfc3dSmrg _Array<_Tp> __a, size_t __s) 1551debfc3dSmrg { 1561debfc3dSmrg _Tp* __p (__a._M_data); 1571debfc3dSmrg for (size_t __i = 0; __i < __n; ++__i, __p += __s) 1581debfc3dSmrg *__p = __e[__i]; 1591debfc3dSmrg } 1601debfc3dSmrg 1611debfc3dSmrg // Copy n consecutive elements of e into elements of a indexed by 1621debfc3dSmrg // contents of i. I.e., a[i[0]] = e[0]. 1631debfc3dSmrg template<typename _Tp, class _Dom> 1641debfc3dSmrg void __valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,_Array<size_t> __i)1651debfc3dSmrg __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 1661debfc3dSmrg _Array<_Tp> __a, _Array<size_t> __i) 1671debfc3dSmrg { 1681debfc3dSmrg size_t* __j (__i._M_data); 1691debfc3dSmrg for (size_t __k = 0; __k < __n; ++__k, ++__j) 1701debfc3dSmrg __a._M_data[*__j] = __e[__k]; 1711debfc3dSmrg } 1721debfc3dSmrg 1731debfc3dSmrg // Copy n elements of e indexed by contents of f into elements of a 1741debfc3dSmrg // indexed by contents of i. I.e., a[i[0]] = e[f[0]]. 1751debfc3dSmrg template<typename _Tp> 1761debfc3dSmrg void __valarray_copy(_Array<_Tp> __e,_Array<size_t> __f,size_t __n,_Array<_Tp> __a,_Array<size_t> __i)1771debfc3dSmrg __valarray_copy(_Array<_Tp> __e, _Array<size_t> __f, 1781debfc3dSmrg size_t __n, 1791debfc3dSmrg _Array<_Tp> __a, _Array<size_t> __i) 1801debfc3dSmrg { 1811debfc3dSmrg size_t* __g (__f._M_data); 1821debfc3dSmrg size_t* __j (__i._M_data); 1831debfc3dSmrg for (size_t __k = 0; __k < __n; ++__k, ++__j, ++__g) 1841debfc3dSmrg __a._M_data[*__j] = __e._M_data[*__g]; 1851debfc3dSmrg } 1861debfc3dSmrg 1871debfc3dSmrg // Copy n consecutive elements of e into elements of a. Elements of 1881debfc3dSmrg // a are skipped if the corresponding element of m is false. m must 1891debfc3dSmrg // have at least n true elements and a must have at least as many 1901debfc3dSmrg // elements as the index of the nth true element of m. I.e. if m 1911debfc3dSmrg // has 5 false followed by 10 true elements and n == 10, a must have 1921debfc3dSmrg // at least 15 elements. 1931debfc3dSmrg template<typename _Tp, class _Dom> 1941debfc3dSmrg void __valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,_Array<bool> __m)1951debfc3dSmrg __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 1961debfc3dSmrg _Array<_Tp> __a, _Array<bool> __m) 1971debfc3dSmrg { 1981debfc3dSmrg bool* __ok (__m._M_data); 1991debfc3dSmrg _Tp* __p (__a._M_data); 2001debfc3dSmrg for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p) 2011debfc3dSmrg { 2021debfc3dSmrg while (! *__ok) 2031debfc3dSmrg { 2041debfc3dSmrg ++__ok; 2051debfc3dSmrg ++__p; 2061debfc3dSmrg } 2071debfc3dSmrg *__p = __e[__i]; 2081debfc3dSmrg } 2091debfc3dSmrg } 2101debfc3dSmrg 2111debfc3dSmrg 2121debfc3dSmrg template<typename _Tp, class _Dom> 2131debfc3dSmrg void __valarray_copy_construct(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a)2141debfc3dSmrg __valarray_copy_construct(const _Expr<_Dom, _Tp>& __e, size_t __n, 2151debfc3dSmrg _Array<_Tp> __a) 2161debfc3dSmrg { 2171debfc3dSmrg _Tp* __p (__a._M_data); 2181debfc3dSmrg for (size_t __i = 0; __i < __n; ++__i, ++__p) 2191debfc3dSmrg new (__p) _Tp(__e[__i]); 2201debfc3dSmrg } 2211debfc3dSmrg 2221debfc3dSmrg 2231debfc3dSmrg template<typename _Tp> 2241debfc3dSmrg void __valarray_copy_construct(_Array<_Tp> __a,_Array<bool> __m,_Array<_Tp> __b,size_t __n)2251debfc3dSmrg __valarray_copy_construct(_Array<_Tp> __a, _Array<bool> __m, 2261debfc3dSmrg _Array<_Tp> __b, size_t __n) 2271debfc3dSmrg { 2281debfc3dSmrg _Tp* __p (__a._M_data); 2291debfc3dSmrg bool* __ok (__m._M_data); 2301debfc3dSmrg for (_Tp* __q = __b._M_data; __q < __b._M_data+__n; ++__q, ++__ok, ++__p) 2311debfc3dSmrg { 2321debfc3dSmrg while (! *__ok) 2331debfc3dSmrg { 2341debfc3dSmrg ++__ok; 2351debfc3dSmrg ++__p; 2361debfc3dSmrg } 2371debfc3dSmrg new (__q) _Tp(*__p); 2381debfc3dSmrg } 2391debfc3dSmrg } 2401debfc3dSmrg 2411debfc3dSmrg _GLIBCXX_END_NAMESPACE_VERSION 2421debfc3dSmrg } // namespace 2431debfc3dSmrg 2441debfc3dSmrg #endif /* _VALARRAY_ARRAY_TCC */ 245