source: sasview/src/sas/sascalc/simulation/iqPy/libiqPy/tnt/tnt_array1d.h @ 2ab812d

Last change on this file since 2ab812d was d85c194, checked in by Piotr Rozyczko <piotr.rozyczko@…>, 9 years ago

Remaining modules refactored

  • Property mode set to 100644
File size: 4.8 KB
Line 
1/*
2*
3* Template Numerical Toolkit (TNT)
4*
5* Mathematical and Computational Sciences Division
6* National Institute of Technology,
7* Gaithersburg, MD USA
8*
9*
10* This software was developed at the National Institute of Standards and
11* Technology (NIST) by employees of the Federal Government in the course
12* of their official duties. Pursuant to title 17 Section 105 of the
13* United States Code, this software is not subject to copyright protection
14* and is in the public domain. NIST assumes no responsibility whatsoever for
15* its use by other parties, and makes no guarantees, expressed or implied,
16* about its quality, reliability, or any other characteristic.
17*
18*/
19
20
21
22#ifndef TNT_ARRAY1D_H
23#define TNT_ARRAY1D_H
24
25//#include <cstdlib>
26#include <iostream>
27
28#ifdef TNT_BOUNDS_CHECK
29#include <assert.h>
30#endif
31
32
33#include "tnt_i_refvec.h"
34
35namespace TNT
36{
37
38template <class T>
39class Array1D
40{
41
42  private:
43
44          /* ... */
45    i_refvec<T> v_;
46    int n_;
47    T* data_;                           /* this normally points to v_.begin(), but
48                             * could also point to a portion (subvector)
49                                                         * of v_.
50                            */
51
52    void copy_(T* p, const T*  q, int len) const;
53    void set_(T* begin,  T* end, const T& val);
54 
55
56  public:
57
58    typedef         T   value_type;
59
60
61                 Array1D();
62        explicit Array1D(int n);
63                 Array1D(int n, const T &a);
64                 Array1D(int n,  T *a);
65    inline   Array1D(const Array1D &A);
66        inline   operator T*();
67        inline   operator const T*();
68        inline   Array1D & operator=(const T &a);
69        inline   Array1D & operator=(const Array1D &A);
70        inline   Array1D & ref(const Array1D &A);
71                 Array1D copy() const;
72                     Array1D & inject(const Array1D & A);
73        inline   T& operator[](int i);
74        inline   const T& operator[](int i) const;
75        inline   int dim1() const;
76        inline   int dim() const;
77              ~Array1D();
78
79
80        /* ... extended interface ... */
81
82        inline int ref_count() const;
83        inline Array1D<T> subarray(int i0, int i1);
84
85};
86
87
88
89
90template <class T>
91Array1D<T>::Array1D() : v_(), n_(0), data_(0) {}
92
93template <class T>
94Array1D<T>::Array1D(const Array1D<T> &A) : v_(A.v_),  n_(A.n_), 
95                data_(A.data_)
96{
97#ifdef TNT_DEBUG
98        std::cout << "Created Array1D(const Array1D<T> &A) \n";
99#endif
100
101}
102
103
104template <class T>
105Array1D<T>::Array1D(int n) : v_(n), n_(n), data_(v_.begin())
106{
107#ifdef TNT_DEBUG
108        std::cout << "Created Array1D(int n) \n";
109#endif
110}
111
112template <class T>
113Array1D<T>::Array1D(int n, const T &val) : v_(n), n_(n), data_(v_.begin()) 
114{
115#ifdef TNT_DEBUG
116        std::cout << "Created Array1D(int n, const T& val) \n";
117#endif
118        set_(data_, data_+ n, val);
119
120}
121
122template <class T>
123Array1D<T>::Array1D(int n, T *a) : v_(a), n_(n) , data_(v_.begin())
124{
125#ifdef TNT_DEBUG
126        std::cout << "Created Array1D(int n, T* a) \n";
127#endif
128}
129
130template <class T>
131inline Array1D<T>::operator T*()
132{
133        return &(v_[0]);
134}
135
136
137template <class T>
138inline Array1D<T>::operator const T*()
139{
140        return &(v_[0]);
141}
142
143
144
145template <class T>
146inline T& Array1D<T>::operator[](int i) 
147{ 
148#ifdef TNT_BOUNDS_CHECK
149        assert(i>= 0);
150        assert(i < n_);
151#endif
152        return data_[i]; 
153}
154
155template <class T>
156inline const T& Array1D<T>::operator[](int i) const 
157{ 
158#ifdef TNT_BOUNDS_CHECK
159        assert(i>= 0);
160        assert(i < n_);
161#endif
162        return data_[i]; 
163}
164
165
166       
167
168template <class T>
169Array1D<T> & Array1D<T>::operator=(const T &a)
170{
171        set_(data_, data_+n_, a);
172        return *this;
173}
174
175template <class T>
176Array1D<T> Array1D<T>::copy() const
177{
178        Array1D A( n_);
179        copy_(A.data_, data_, n_);
180
181        return A;
182}
183
184
185template <class T>
186Array1D<T> & Array1D<T>::inject(const Array1D &A)
187{
188        if (A.n_ == n_)
189                copy_(data_, A.data_, n_);
190
191        return *this;
192}
193
194
195
196
197
198template <class T>
199Array1D<T> & Array1D<T>::ref(const Array1D<T> &A)
200{
201        if (this != &A)
202        {
203                v_ = A.v_;              /* operator= handles the reference counting. */
204                n_ = A.n_;
205                data_ = A.data_; 
206               
207        }
208        return *this;
209}
210
211template <class T>
212Array1D<T> & Array1D<T>::operator=(const Array1D<T> &A)
213{
214        return ref(A);
215}
216
217template <class T>
218inline int Array1D<T>::dim1() const { return n_; }
219
220template <class T>
221inline int Array1D<T>::dim() const { return n_; }
222
223template <class T>
224Array1D<T>::~Array1D() {}
225
226
227/* ............................ exented interface ......................*/
228
229template <class T>
230inline int Array1D<T>::ref_count() const
231{
232        return v_.ref_count();
233}
234
235template <class T>
236inline Array1D<T> Array1D<T>::subarray(int i0, int i1)
237{
238        if ((i0 > 0) && (i1 < n_) || (i0 <= i1))
239        {
240                Array1D<T> X(*this);  /* create a new instance of this array. */
241                X.n_ = i1-i0+1;
242                X.data_ += i0;
243
244                return X;
245        }
246        else
247        {
248                return Array1D<T>();
249        }
250}
251
252
253/* private internal functions */
254
255
256template <class T>
257void Array1D<T>::set_(T* begin, T* end, const T& a)
258{
259        for (T* p=begin; p<end; p++)
260                *p = a;
261
262}
263
264template <class T>
265void Array1D<T>::copy_(T* p, const T* q, int len) const
266{
267        T *end = p + len;
268        while (p<end )
269                *p++ = *q++;
270
271}
272
273
274} /* namespace TNT */
275
276#endif
277/* TNT_ARRAY1D_H */
278
Note: See TracBrowser for help on using the repository browser.