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