valarray.cpp revision 353358
1138568Ssam//===------------------------ valarray.cpp --------------------------------===// 2186904Ssam// 3138568Ssam// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4138568Ssam// See https://llvm.org/LICENSE.txt for license information. 5138568Ssam// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6138568Ssam// 7138568Ssam//===----------------------------------------------------------------------===// 8138568Ssam 9138568Ssam#include "valarray" 10138568Ssam 11138568Ssam_LIBCPP_BEGIN_NAMESPACE_STD 12138568Ssam 13138568Ssam// These two symbols are part of the v1 ABI but not part of the >=v2 ABI. 14138568Ssam#if _LIBCPP_ABI_VERSION == 1 15138568Ssamtemplate valarray<size_t>::valarray(size_t); 16138568Ssamtemplate valarray<size_t>::~valarray(); 17138568Ssam#endif 18138568Ssam 19138568Ssamtemplate void valarray<size_t>::resize(size_t, size_t); 20138568Ssam 21138568Ssamvoid 22138568Ssamgslice::__init(size_t __start) 23138568Ssam{ 24138568Ssam valarray<size_t> __indices(__size_.size()); 25138568Ssam size_t __k = __size_.size() != 0; 26138568Ssam for (size_t __i = 0; __i < __size_.size(); ++__i) 27138568Ssam __k *= __size_[__i]; 28138568Ssam __1d_.resize(__k); 29138568Ssam if (__1d_.size()) 30138568Ssam { 31138568Ssam __k = 0; 32178354Ssam __1d_[__k] = __start; 33178354Ssam while (true) 34138568Ssam { 35138568Ssam size_t __i = __indices.size() - 1; 36138568Ssam while (true) 37138568Ssam { 38138568Ssam if (++__indices[__i] < __size_[__i]) 39138568Ssam { 40138568Ssam ++__k; 41138568Ssam __1d_[__k] = __1d_[__k-1] + __stride_[__i]; 42138568Ssam for (size_t __j = __i + 1; __j != __indices.size(); ++__j) 43138568Ssam __1d_[__k] -= __stride_[__j] * (__size_[__j] - 1); 44138568Ssam break; 45192468Ssam } 46138568Ssam else 47190526Ssam { 48178354Ssam if (__i == 0) 49138568Ssam return; 50178354Ssam __indices[__i--] = 0; 51138568Ssam } 52138568Ssam } 53196019Srwatson } 54138568Ssam } 55138568Ssam} 56195757Ssam 57138568Ssam_LIBCPP_END_NAMESPACE_STD 58138568Ssam