[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Toon-members] TooN Makefile.in TooN.h numdiff.awk internal/al...
From: |
Edward Rosten |
Subject: |
[Toon-members] TooN Makefile.in TooN.h numdiff.awk internal/al... |
Date: |
Mon, 28 Sep 2009 08:31:58 +0000 |
CVSROOT: /cvsroot/toon
Module name: TooN
Changes by: Edward Rosten <edrosten> 09/09/28 08:31:58
Modified files:
. : Makefile.in TooN.h numdiff.awk
internal : allocator.hh vbase.hh vector.hh
test : resize_test.cc
Log message:
Reworked resizable vectors.
Assignment (except for construction) does not cause a resize: it works
exactly
the same as Dynamic vectors. Resizing is only caused by the .resize()
method.
Resize now keeps data where possible, but new elements are
uninitialized.
Internally the memory is managed by std::vector, so growing repeatedly
is
efficient.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/Makefile.in?cvsroot=toon&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/TooN/TooN.h?cvsroot=toon&r1=1.55&r2=1.56
http://cvs.savannah.gnu.org/viewcvs/TooN/numdiff.awk?cvsroot=toon&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/allocator.hh?cvsroot=toon&r1=1.34&r2=1.35
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vbase.hh?cvsroot=toon&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vector.hh?cvsroot=toon&r1=1.50&r2=1.51
http://cvs.savannah.gnu.org/viewcvs/TooN/test/resize_test.cc?cvsroot=toon&r1=1.1&r2=1.2
Patches:
Index: Makefile.in
===================================================================
RCS file: /cvsroot/toon/TooN/Makefile.in,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- Makefile.in 23 Sep 2009 20:38:09 -0000 1.12
+++ Makefile.in 28 Sep 2009 08:31:58 -0000 1.13
@@ -36,7 +36,7 @@
doxygen
-TESTS=invert slice
+TESTS=invert slice vector_resize
TEST_RESULT=$(TESTS:%=regressions/%.result)
@@ -46,6 +46,7 @@
rm -f $(TEST_FILES)
test:regressions/results
+ @echo -------------- Test Results ---------------
@cat regressions/results
regressions/results:$(TEST_RESULT)
Index: TooN.h
===================================================================
RCS file: /cvsroot/toon/TooN/TooN.h,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -b -r1.55 -r1.56
--- TooN.h 8 Sep 2009 14:25:09 -0000 1.55
+++ TooN.h 28 Sep 2009 08:31:58 -0000 1.56
@@ -36,6 +36,7 @@
#include <limits>
#include <new>
#include <utility>
+#include <vector>
#include <TooN/internal/config.hh>
#include <TooN/internal/typeof.hh>
#include <TooN/internal/deprecated.hh>
Index: numdiff.awk
===================================================================
RCS file: /cvsroot/toon/TooN/numdiff.awk,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- numdiff.awk 23 Sep 2009 13:43:55 -0000 1.1
+++ numdiff.awk 28 Sep 2009 08:31:58 -0000 1.2
@@ -9,8 +9,36 @@
return x<0?-x:x
}
+function ignore_and_process(line, a)
+{
+ if(line ~ /^[[:space:]]*$/)
+ return 1
+ else if (line ~ /^[[:space:]]*#>/)
+ {
+ split(line, a)
+ if(a[2] == "t")
+ t = a[3]
+
+ return 1
+ }
+ else if (line ~ /^[[:space:]]*#/)
+ return 1
+ else
+ return 0
+}
+
BEGIN{
+ #This program compares two files to see if they are the same
+ #Whitespace is ignored
+ #Numbers must match to within a given threshold.
+
+ #Lines starting with a # are also ignored.
+ #If a # is *not* the first non-whitespace, then it is not ignored.
+ #Lines starting with #> are directives and are processed further
+ #Directives are
+ # #> t xx Set t to xx
+
if(t == "")
t = 1e-6
@@ -19,11 +47,11 @@
#Get the next non blank line from the two files
do
status1 = (getline s1 < f1)
- while(status1 && s1 ~ /^[[:space:]]*$/)
+ while(status1 && ignore_and_process(s1))
do
status2 = (getline s2 < f2)
- while(status2 && s2 ~ /^[[:space:]]*$/)
+ while(status2 && ignore_and_process(s2))
#Check to see if the files have both ended
if(status1 != status2)
Index: internal/allocator.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/allocator.hh,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- internal/allocator.hh 7 Sep 2009 11:13:15 -0000 1.34
+++ internal/allocator.hh 28 Sep 2009 08:31:58 -0000 1.35
@@ -58,6 +58,15 @@
debug_initialize(my_data, Size);
}
+ Precision *data()
+ {
+ return my_data;
+ };
+
+ const Precision *data() const
+ {
+ return my_data;
+ };
Precision my_data[Size];
};
@@ -69,6 +78,16 @@
debug_initialize(my_data, Size);
}
+ double *data()
+ {
+ return my_data;
+ };
+
+ const double *data() const
+ {
+ return my_data;
+ };
+
double my_data[Size] TOON_ALIGN8 ;
};
@@ -90,6 +109,16 @@
Precision *my_data;
+ Precision *data()
+ {
+ return my_data;
+ };
+
+ const Precision *data() const
+ {
+ return my_data;
+ };
+
StackOrHeap(const StackOrHeap& from)
:my_data(new Precision[Size])
{
@@ -129,10 +158,6 @@
return Size;
}
- void try_resize(int)
- {}
- template<class Op> void try_resize(const Operator<Op>&)
- {}
};
template<class Precision> struct VectorAlloc<Dynamic, Precision> {
@@ -167,81 +192,61 @@
delete[] my_data;
}
- void try_resize(int)
- {}
+ Precision *data()
+ {
+ return my_data;
+ };
+
+ const Precision *data() const
+ {
+ return my_data;
+ };
- template<class Op> void try_resize(const Operator<Op>&)
- {}
};
template<class Precision> struct VectorAlloc<Resizable, Precision> {
protected:
- Precision * my_data;
- int my_size;
-
+ std::vector<Precision> numbers;
public:
- VectorAlloc(const VectorAlloc& v)
- :my_data(new Precision[v.my_size]), my_size(v.my_size)
- {
- for(int i=0; i < my_size; i++)
- my_data[i] = v.my_data[i];
- }
-
VectorAlloc()
- :my_data(0), my_size(0)
{
}
VectorAlloc(int s)
- :my_data(new Precision[s]), my_size(s)
+ :numbers(s)
{
- debug_initialize(my_data, my_size);
+ debug_initialize(data(), size());
}
template <class Op>
VectorAlloc(const Operator<Op>& op)
- : my_data(new Precision[op.size()]), my_size(op.size())
+ :numbers(op.size())
{
- debug_initialize(my_data, my_size);
+ debug_initialize(data(), size());
}
int size() const {
- return my_size;
- }
-
- ~VectorAlloc(){
- delete[] my_data;
+ return numbers.size();
}
- void resize(int s)
- {
- if(s != my_size)
- {
- //First, invalidate the old data
- my_size=0;
- delete[] my_data;
-
- my_data = new Precision[s];
- my_size = s;
+ Precision* data() {
+ return &numbers[0];
}
- debug_initialize(my_data, my_size);
+ const Precision* data()const {
+ return &numbers[0];
}
- void try_resize(int s)
- {
- resize(s);
- }
-
-
- template<class Op> void try_resize(const Operator<Op>& op)
+ void resize(int s)
{
- resize(op.size());
+ int old_size = size();
+ numbers.resize(s);
+ if(s > old_size)
+ debug_initialize(data()+old_size, s-old_size);
}
-
};
template<int S, class Precision> struct VectorSlice
@@ -262,11 +267,15 @@
template<class Op>
VectorSlice(const Operator<Op>& op) : my_data(op.data()) {}
- void try_resize(int)
- {}
+ Precision *data()
+ {
+ return my_data;
+ };
- template<class Op> void try_resize(const Operator<Op>&)
- {}
+ const Precision *data() const
+ {
+ return my_data;
+ };
};
template<class Precision> struct VectorSlice<-1, Precision>
@@ -285,11 +294,15 @@
return my_size;
}
- void try_resize(int)
- {}
+ Precision *data()
+ {
+ return my_data;
+ };
- template<class Op> void try_resize(const Operator<Op>&)
- {}
+ const Precision *data() const
+ {
+ return my_data;
+ };
};
Index: internal/vbase.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/vbase.hh,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- internal/vbase.hh 27 Aug 2009 17:29:31 -0000 1.39
+++ internal/vbase.hh 28 Sep 2009 08:31:58 -0000 1.40
@@ -107,30 +107,30 @@
template<class Op>
GenericVBase(const Operator<Op> & op) : Mem(op),
StrideHolder<Stride>(op) {}
- using Mem::my_data;
+ using Mem::data;
using Mem::size;
Precision& operator[](int i) {
Internal::check_index(size(), i);
- return my_data[i * stride()];
+ return data()[i * stride()];
}
const Precision& operator[](int i) const {
Internal::check_index(size(), i);
- return my_data[i * stride()];
+ return data()[i * stride()];
}
//Completely generic Vector slice operations below:
template<int Start, int Length>
Vector<Length, Precision, SliceVBase<Stride> > slice(int start, int
length){
Internal::CheckSlice<Size, Start, Length>::check(size(), start,
length);
- return Vector<Length, Precision, SliceVBase<Stride> >(my_data +
stride() * (Start==Dynamic?start:Start), Length==Dynamic?length:Length,
stride(), Slicing());
+ return Vector<Length, Precision, SliceVBase<Stride> >(data() +
stride() * (Start==Dynamic?start:Start), Length==Dynamic?length:Length,
stride(), Slicing());
}
template<int Start, int Length>
const Vector<Length, Precision, SliceVBase<Stride> > slice(int start,
int length) const{
Internal::CheckSlice<Size, Start, Length>::check(size(), start,
length);
- return Vector<Length, Precision, SliceVBase<Stride>
>(const_cast<Precision*>(my_data) + stride() * (Start==Dynamic?start:Start),
Length==Dynamic?length:Length, stride(), Slicing());
+ return Vector<Length, Precision, SliceVBase<Stride>
>(const_cast<Precision*>(data()) + stride() * (Start==Dynamic?start:Start),
Length==Dynamic?length:Length, stride(), Slicing());
}
@@ -217,37 +217,37 @@
//Other slices below
const Matrix<1, Size, Precision, Slice<1,Stride> > as_row() const{
- return Matrix<1, Size, Precision, Slice<1,Stride>
>(const_cast<Precision*>(my_data), 1, size(), 1, stride(), Slicing());
+ return Matrix<1, Size, Precision, Slice<1,Stride>
>(const_cast<Precision*>(data()), 1, size(), 1, stride(), Slicing());
}
Matrix<1, Size, Precision, Slice<1,Stride> > as_row(){
- return Matrix<1, Size, Precision, Slice<1,Stride> >(my_data, 1,
size(), 1, stride(), Slicing());
+ return Matrix<1, Size, Precision, Slice<1,Stride> >(data(), 1,
size(), 1, stride(), Slicing());
}
const Matrix<Size, 1, Precision, Slice<Stride,1> > as_col() const{
- return Matrix<Size, 1, Precision, Slice<Stride,1>
>(const_cast<Precision*>(my_data), size(), 1, stride(), 1, Slicing());
+ return Matrix<Size, 1, Precision, Slice<Stride,1>
>(const_cast<Precision*>(data()), size(), 1, stride(), 1, Slicing());
}
Matrix<Size, 1, Precision, Slice<Stride,1> > as_col(){
- return Matrix<Size, 1, Precision, Slice<Stride,1> >(my_data,
size(), 1, stride(), 1, Slicing());
+ return Matrix<Size, 1, Precision, Slice<Stride,1> >(data(),
size(), 1, stride(), 1, Slicing());
}
typedef Vector<Size, Precision, SliceVBase<Stride> > as_slice_type;
Vector<Size, Precision, SliceVBase<Stride> > as_slice(){
- return Vector<Size, Precision, SliceVBase<Stride> >(my_data,
size(), stride(), Slicing());
+ return Vector<Size, Precision, SliceVBase<Stride> >(data(),
size(), stride(), Slicing());
}
const Vector<Size, Precision, SliceVBase<Stride> > as_slice() const {
- return Vector<Size, Precision, SliceVBase<Stride>
>(const_cast<Precision*>(my_data), size(), stride(), Slicing());
+ return Vector<Size, Precision, SliceVBase<Stride>
>(const_cast<Precision*>(data()), size(), stride(), Slicing());
}
DiagonalMatrix<Size,Precision, SliceVBase<Stride> > as_diagonal() {
- return DiagonalMatrix<Size, Precision, SliceVBase<Stride> >
(my_data, size(), stride(), Slicing());
+ return DiagonalMatrix<Size, Precision, SliceVBase<Stride> >
(data(), size(), stride(), Slicing());
}
const DiagonalMatrix<Size,Precision, SliceVBase<Stride> > as_diagonal()
const {
- return DiagonalMatrix<Size, Precision, SliceVBase<Stride> >
(const_cast<Precision*>(my_data), size(), stride(), Slicing());
+ return DiagonalMatrix<Size, Precision, SliceVBase<Stride> >
(const_cast<Precision*>(data()), size(), stride(), Slicing());
}
};
Index: internal/vector.hh
===================================================================
RCS file: /cvsroot/toon/TooN/internal/vector.hh,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -b -r1.50 -r1.51
--- internal/vector.hh 7 Sep 2009 11:13:15 -0000 1.50
+++ internal/vector.hh 28 Sep 2009 08:31:58 -0000 1.51
@@ -127,7 +127,6 @@
template<int Size=Dynamic, typename Precision=DefaultPrecision, typename
Base=Internal::VBase>
struct Vector : public Base::template VLayout<Size, Precision> {
protected:
- using Base::template VLayout<Size, Precision>::try_resize;
public:
// sneaky hack: only one of these constructors will work with any given base
// class but they don't generate errors unless the user tries to use one of
them
@@ -232,7 +231,6 @@
/// operator = from copy
inline Vector& operator= (const Vector& from){
- try_resize(from.size()); //This might do nothing
SizeMismatch<Size,Size>::test(size(), from.size());
const int s=size();
for(int i=0; i<s; i++){
@@ -244,7 +242,6 @@
/// operator = another Vector
template<int Size2, typename Precision2, typename Base2>
Vector<Size,Precision,Base >& operator= (const Vector<Size2,
Precision2, Base2>& from){
- try_resize(from.size()); //This might do nothing
SizeMismatch<Size,Size2>::test(size(), from.size());
const int s=size();
for(int i=0; i<s; i++){
@@ -256,7 +253,6 @@
/// assignment from an Operator object
template <class Op>
inline Vector & operator=(const Operator<Op>& op){
- try_resize(op); //This might do nothing
op.eval(*this);
return *this;
}
Index: test/resize_test.cc
===================================================================
RCS file: /cvsroot/toon/TooN/test/resize_test.cc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- test/resize_test.cc 7 Sep 2009 11:13:15 -0000 1.1
+++ test/resize_test.cc 28 Sep 2009 08:31:58 -0000 1.2
@@ -4,19 +4,25 @@
int main()
{
- Vector<Resizable> r;
+ Vector<Resizable> r = makeVector(4);
Vector<> v1(makeVector(1, 2));
+ cout << r << endl;
+
+ r.resize(v1.size());
r = v1;
cout << r << endl;
Vector<3> v2 = makeVector(2, 3, 4);
+ r.resize(3);
r = v2;
cout << r << endl;
- r = Ones(10);
+ r.resize(10);
+ r = Ones;
cout << r << endl;
+ r.resize(5);
r = makeVector(6, 7, 8, 9, 0);
cout << r << endl;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Toon-members] TooN Makefile.in TooN.h numdiff.awk internal/al...,
Edward Rosten <=