1 /* $Id: CoinDenseVector.cpp 1373 2011-01-03 23:57:44Z lou $ */
2 // Copyright (C) 2003, International Business Machines
3 // Corporation and others. All Rights Resized.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5
6 #if defined(_MSC_VER)
7 // Turn off compiler warning about long names
8 # pragma warning(disable:4786)
9 #endif
10
11 #include <cassert>
12 #include "CoinDenseVector.hpp"
13 #include "CoinHelperFunctions.hpp"
14
15 //#############################################################################
16
17 template <typename T> void
clear()18 CoinDenseVector<T>::clear()
19 {
20 memset(elements_, 0, nElements_*sizeof(T));
21 }
22
23 //#############################################################################
24
25 template <typename T> CoinDenseVector<T> &
operator =(const CoinDenseVector<T> & rhs)26 CoinDenseVector<T>::operator=(const CoinDenseVector<T> & rhs)
27 {
28 if (this != &rhs) {
29 setVector(rhs.getNumElements(), rhs.getElements());
30 }
31 return *this;
32 }
33
34 //#############################################################################
35
36 template <typename T> void
setVector(int size,const T * elems)37 CoinDenseVector<T>::setVector(int size, const T * elems)
38 {
39 resize(size);
40 CoinMemcpyN( elems,size,elements_);
41 }
42
43 //#############################################################################
44
45 template <typename T> void
setConstant(int size,T value)46 CoinDenseVector<T>::setConstant(int size, T value)
47 {
48 resize(size);
49 for(int i=0; i<size; i++)
50 elements_[i] = value;
51 }
52
53 //#############################################################################
54
55 template <typename T> void
resize(int newsize,T value)56 CoinDenseVector<T>::resize(int newsize, T value)
57 {
58 if (newsize != nElements_){
59 assert(newsize > 0);
60 T *newarray = new T[newsize];
61 int cpysize = CoinMin(newsize, nElements_);
62 CoinMemcpyN( elements_,cpysize,newarray);
63 delete[] elements_;
64 elements_ = newarray;
65 nElements_ = newsize;
66 for(int i=cpysize; i<newsize; i++)
67 elements_[i] = value;
68 }
69 }
70
71 //#############################################################################
72
73 template <typename T> void
setElement(int index,T element)74 CoinDenseVector<T>::setElement(int index, T element)
75 {
76 assert(index >= 0 && index < nElements_);
77 elements_[index] = element;
78 }
79
80 //#############################################################################
81
82 template <typename T> void
append(const CoinDenseVector<T> & caboose)83 CoinDenseVector<T>::append(const CoinDenseVector<T> & caboose)
84 {
85 const int s = nElements_;
86 const int cs = caboose.getNumElements();
87 int newsize = s + cs;
88 resize(newsize);
89 const T * celem = caboose.getElements();
90 CoinDisjointCopyN(celem, cs, elements_ + s);
91 }
92
93 //#############################################################################
94
95 template <typename T> void
operator +=(T value)96 CoinDenseVector<T>::operator+=(T value)
97 {
98 for(int i=0; i<nElements_; i++)
99 elements_[i] += value;
100 }
101
102 //-----------------------------------------------------------------------------
103
104 template <typename T> void
operator -=(T value)105 CoinDenseVector<T>::operator-=(T value)
106 {
107 for(int i=0; i<nElements_; i++)
108 elements_[i] -= value;
109 }
110
111 //-----------------------------------------------------------------------------
112
113 template <typename T> void
operator *=(T value)114 CoinDenseVector<T>::operator*=(T value)
115 {
116 for(int i=0; i<nElements_; i++)
117 elements_[i] *= value;
118 }
119
120 //-----------------------------------------------------------------------------
121
122 template <typename T> void
operator /=(T value)123 CoinDenseVector<T>::operator/=(T value)
124 {
125 for(int i=0; i<nElements_; i++)
126 elements_[i] /= value;
127 }
128
129 //#############################################################################
130
CoinDenseVector()131 template <typename T> CoinDenseVector<T>::CoinDenseVector():
132 nElements_(0),
133 elements_(NULL)
134 {}
135
136 //#############################################################################
137
138 template <typename T>
CoinDenseVector(int size,const T * elems)139 CoinDenseVector<T>::CoinDenseVector(int size, const T * elems):
140 nElements_(0),
141 elements_(NULL)
142 {
143 gutsOfSetVector(size, elems);
144 }
145
146 //-----------------------------------------------------------------------------
147
CoinDenseVector(int size,T value)148 template <typename T> CoinDenseVector<T>::CoinDenseVector(int size, T value):
149 nElements_(0),
150 elements_(NULL)
151 {
152 gutsOfSetConstant(size, value);
153 }
154
155 //-----------------------------------------------------------------------------
156
157 template <typename T>
CoinDenseVector(const CoinDenseVector<T> & rhs)158 CoinDenseVector<T>::CoinDenseVector(const CoinDenseVector<T> & rhs):
159 nElements_(0),
160 elements_(NULL)
161 {
162 setVector(rhs.getNumElements(), rhs.getElements());
163 }
164
165 //-----------------------------------------------------------------------------
166
~CoinDenseVector()167 template <typename T> CoinDenseVector<T>::~CoinDenseVector ()
168 {
169 delete [] elements_;
170 }
171
172 //#############################################################################
173
174 template <typename T> void
gutsOfSetVector(int size,const T * elems)175 CoinDenseVector<T>::gutsOfSetVector(int size, const T * elems)
176 {
177 if ( size != 0 ) {
178 resize(size);
179 nElements_ = size;
180 CoinDisjointCopyN(elems, size, elements_);
181 }
182 }
183
184 //-----------------------------------------------------------------------------
185
186 template <typename T> void
gutsOfSetConstant(int size,T value)187 CoinDenseVector<T>::gutsOfSetConstant(int size, T value)
188 {
189 if ( size != 0 ) {
190 resize(size);
191 nElements_ = size;
192 CoinFillN(elements_, size, value);
193 }
194 }
195
196 //#############################################################################
197 /** Access the i'th element of the dense vector. */
198 template <typename T> T &
operator [](int index) const199 CoinDenseVector<T>::operator[](int index) const
200 {
201 assert(index >= 0 && index < nElements_);
202 T *where = elements_ + index;
203 return *where;
204 }
205 //#############################################################################
206
207 // template class CoinDenseVector<int>; This works but causes warning messages
208 template class CoinDenseVector<float>;
209 template class CoinDenseVector<double>;
210