Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TArrayD.cxx
Go to the documentation of this file.
1 // @(#)root/cont:$Id$
2 // Author: Rene Brun 06/03/95
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 /** \class TArrayD
13 \ingroup Containers
14 Array of doubles (64 bits per element).
15 */
16 
17 #include "TArrayD.h"
18 #include "TBuffer.h"
19 
20 
21 ClassImp(TArrayD);
22 
23 ////////////////////////////////////////////////////////////////////////////////
24 /// Default TArrayD ctor.
25 
26 TArrayD::TArrayD()
27 {
28  fArray = 0;
29 }
30 
31 ////////////////////////////////////////////////////////////////////////////////
32 /// Create TArrayD object and set array size to n doubles.
33 
34 TArrayD::TArrayD(Int_t n)
35 {
36  fArray = 0;
37  if (n > 0) Set(n);
38 }
39 
40 ////////////////////////////////////////////////////////////////////////////////
41 /// Create TArrayD object and initialize it with values of array.
42 
43 TArrayD::TArrayD(Int_t n, const Double_t *array)
44 {
45  fArray = 0;
46  Set(n, array);
47 }
48 
49 ////////////////////////////////////////////////////////////////////////////////
50 /// Copy constructor.
51 
52 TArrayD::TArrayD(const TArrayD &array) : TArray(array)
53 {
54  fArray = 0;
55  Set(array.fN, array.fArray);
56 }
57 
58 ////////////////////////////////////////////////////////////////////////////////
59 /// TArrayD assignment operator.
60 
61 TArrayD &TArrayD::operator=(const TArrayD &rhs)
62 {
63  if (this != &rhs)
64  Set(rhs.fN, rhs.fArray);
65  return *this;
66 }
67 
68 ////////////////////////////////////////////////////////////////////////////////
69 /// Delete TArrayD object.
70 
71 TArrayD::~TArrayD()
72 {
73  delete [] fArray;
74  fArray = 0;
75 }
76 
77 ////////////////////////////////////////////////////////////////////////////////
78 /// Adopt array arr into TArrayD, i.e. don't copy arr but use it directly
79 /// in TArrayD. User may not delete arr, TArrayD dtor will do it.
80 
81 void TArrayD::Adopt(Int_t n, Double_t *arr)
82 {
83  if (fArray)
84  delete [] fArray;
85 
86  fN = n;
87  fArray = arr;
88 }
89 
90 ////////////////////////////////////////////////////////////////////////////////
91 /// Set the double c value at position i in the array. Check for out of bounds.
92 /// Warning: the name of the method is misleading, it actually overwrites the position i.
93 
94 void TArrayD::AddAt(Double_t c, Int_t i)
95 {
96  if (!BoundsOk("TArrayD::AddAt", i)) return;
97  fArray[i] = c;
98 }
99 
100 ////////////////////////////////////////////////////////////////////////////////
101 /// Set size of this array to n doubles.
102 /// A new array is created, the old contents copied to the new array,
103 /// then the old array is deleted.
104 /// This function should not be called if the array was declared via Adopt.
105 
106 void TArrayD::Set(Int_t n)
107 {
108  if (n < 0) return;
109  if (n != fN) {
110  Double_t *temp = fArray;
111  if (n != 0) {
112  fArray = new Double_t[n];
113  if (n < fN) memcpy(fArray,temp, n*sizeof(Double_t));
114  else {
115  memcpy(fArray,temp,fN*sizeof(Double_t));
116  memset(&fArray[fN],0,(n-fN)*sizeof(Double_t));
117  }
118  } else {
119  fArray = 0;
120  }
121  if (fN) delete [] temp;
122  fN = n;
123  }
124 }
125 
126 ////////////////////////////////////////////////////////////////////////////////
127 /// Set size of this array to n doubles and set the contents
128 /// This function should not be called if the array was declared via Adopt.
129 
130 void TArrayD::Set(Int_t n, const Double_t *array)
131 {
132  if (fArray && fN != n) {
133  delete [] fArray;
134  fArray = 0;
135  }
136  fN = n;
137  if (fN == 0) return;
138  if (array == 0) return;
139  if (!fArray) fArray = new Double_t[fN];
140  memmove(fArray, array, n*sizeof(Double_t));
141 }
142 
143 ////////////////////////////////////////////////////////////////////////////////
144 /// Stream a TArrayD object.
145 
146 void TArrayD::Streamer(TBuffer &b)
147 {
148  if (b.IsReading()) {
149  Int_t n;
150  b >> n;
151  Set(n);
152  b.ReadFastArray(fArray,n);
153  } else {
154  b << fN;
155  b.WriteFastArray(fArray, fN);
156  }
157 }
158