toon-members
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Toon-members] TooN internal/allocator.hh internal/size_mismat...


From: Georg Klein
Subject: Re: [Toon-members] TooN internal/allocator.hh internal/size_mismat...
Date: Tue, 8 Sep 2009 14:55:49 +0100

Hmm, did you check in the file where Resizable actually gets declared?
My compiler is not finding it..

On Mon, Sep 7, 2009 at 12:13 PM, Edward Rosten<address@hidden> wrote:
> CVSROOT:        /cvsroot/toon
> Module name:    TooN
> Changes by:     Edward Rosten <edrosten>        09/09/07 11:13:15
>
> Modified files:
>        internal       : allocator.hh size_mismatch.hh vector.hh
> Added files:
>        test           : resize_test.cc
>
> Log message:
>        Initial implementation of resizable vectors. This is not an attempt to 
> turn
>        TooN in to a general container library, so they do not retain their 
> data when
>        they are resized. Dynamic vectors are not resizable and will remain so 
> to
>        provide more guarantees than resizable vectors.
>
>        Resize happens on an explicit .resize() and assignment from a Vector or
>        operator. Currently assignment from unsized operators will not compile.
>
>        The syntax is:
>
>        Vector<Resizable> v;  //Will be zero size by default.
>        v.resize(10); //Filled with junk (affected by TooN debugging options)
>        v = makeVector(1, 2, 3);
>        v = Zeros(6);
>
>        v = Ones; //This will not compile.
>
>        etc...
>
> CVSWeb URLs:
> http://cvs.savannah.gnu.org/viewcvs/TooN/internal/allocator.hh?cvsroot=toon&r1=1.33&r2=1.34
> http://cvs.savannah.gnu.org/viewcvs/TooN/internal/size_mismatch.hh?cvsroot=toon&r1=1.5&r2=1.6
> http://cvs.savannah.gnu.org/viewcvs/TooN/internal/vector.hh?cvsroot=toon&r1=1.49&r2=1.50
> http://cvs.savannah.gnu.org/viewcvs/TooN/test/resize_test.cc?cvsroot=toon&rev=1.1
>
> Patches:
> Index: internal/allocator.hh
> ===================================================================
> RCS file: /cvsroot/toon/TooN/internal/allocator.hh,v
> retrieving revision 1.33
> retrieving revision 1.34
> diff -u -b -r1.33 -r1.34
> --- internal/allocator.hh       10 Jul 2009 14:05:55 -0000      1.33
> +++ internal/allocator.hh       7 Sep 2009 11:13:15 -0000       1.34
> @@ -128,9 +128,14 @@
>        int size() const {
>                return Size;
>        }
> +
> +       void try_resize(int)
> +       {}
> +       template<class Op> void try_resize(const Operator<Op>&)
> +       {}
>  };
>
> -template<class Precision> struct VectorAlloc<-1, Precision> {
> +template<class Precision> struct VectorAlloc<Dynamic, Precision> {
>        Precision * const my_data;
>        const int my_size;
>
> @@ -162,9 +167,83 @@
>                delete[] my_data;
>        }
>
> +       void try_resize(int)
> +       {}
> +
> +       template<class Op> void try_resize(const Operator<Op>&)
> +       {}
>  };
>
>
> +template<class Precision> struct VectorAlloc<Resizable, Precision> {
> +       protected:
> +               Precision * my_data;
> +               int my_size;
> +
> +
> +       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)
> +               {
> +                       debug_initialize(my_data, my_size);
> +               }
> +
> +               template <class Op>
> +               VectorAlloc(const Operator<Op>& op)
> +               : my_data(new Precision[op.size()]), my_size(op.size())
> +               {
> +                       debug_initialize(my_data, my_size);
> +               }
> +
> +               int size() const {
> +                       return my_size;
> +               }
> +
> +               ~VectorAlloc(){
> +                       delete[] my_data;
> +               }
> +
> +               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;
> +                       }
> +
> +                       debug_initialize(my_data, my_size);
> +               }
> +
> +               void try_resize(int s)
> +               {
> +                       resize(s);
> +               }
> +
> +
> +               template<class Op> void try_resize(const Operator<Op>& op)
> +               {
> +                       resize(op.size());
> +               }
> +
> +};
> +
>  template<int S, class Precision> struct VectorSlice
>  {
>        int size() const {
> @@ -182,6 +261,12 @@
>
>        template<class Op>
>        VectorSlice(const Operator<Op>& op) : my_data(op.data()) {}
> +
> +       void try_resize(int)
> +       {}
> +
> +       template<class Op> void try_resize(const Operator<Op>&)
> +       {}
>  };
>
>  template<class Precision> struct VectorSlice<-1, Precision>
> @@ -199,6 +284,12 @@
>        int size() const {
>                return my_size;
>        }
> +
> +       void try_resize(int)
> +       {}
> +
> +       template<class Op> void try_resize(const Operator<Op>&)
> +       {}
>  };
>
>
>
> Index: internal/size_mismatch.hh
> ===================================================================
> RCS file: /cvsroot/toon/TooN/internal/size_mismatch.hh,v
> retrieving revision 1.5
> retrieving revision 1.6
> diff -u -b -r1.5 -r1.6
> --- internal/size_mismatch.hh   29 Apr 2009 21:55:51 -0000      1.5
> +++ internal/size_mismatch.hh   7 Sep 2009 11:13:15 -0000       1.6
> @@ -33,16 +33,16 @@
>  // class to generate compile time error
>  // general case which doesn't exist
>  template<int Size1, int Size2>
> -struct SizeMismatch;
> +struct SizeMismatch_;
>
>  // special cases which do exist
>  template<int Size>
> -struct SizeMismatch<Size,Size>{
> +struct SizeMismatch_<Size,Size>{
>   static inline void test(int, int){}
>  };
>
>  template<int Size>
> -struct SizeMismatch<-1,Size>{
> +struct SizeMismatch_<Dynamic,Size>{
>   static inline void test(int size1, int size2){
>     if(size1!=size2){
>          #ifdef TOON_TEST_INTERNALS
> @@ -56,7 +56,7 @@
>  };
>
>  template<int Size>
> -struct SizeMismatch<Size,-1>{
> +struct SizeMismatch_<Size,Dynamic>{
>   static inline void test(int size1, int size2){
>     if(size1!=size2){
>          #ifdef TOON_TEST_INTERNALS
> @@ -70,7 +70,7 @@
>  };
>
>  template <>
> -struct SizeMismatch<-1,-1>{
> +struct SizeMismatch_<Dynamic,Dynamic>{
>   static inline void test(int size1, int size2){
>     if(size1!=size2){
>          #ifdef TOON_TEST_INTERNALS
> @@ -89,7 +89,7 @@
>  }
>
>  template<int Size1, int Size2>
> -struct SizeMismatch
> +struct SizeMismatch_
>  {
>        static inline void test(int, int)
>        {
> @@ -101,4 +101,14 @@
>        }
>  };
>
> +template<int Size1, int Size2>
> +struct SizeMismatch
> +{
> +       static inline void test(int s1, int s2)
> +       {
> +               SizeMismatch_< (Size1 == Dynamic || Size1 == 
> Resizable)?Dynamic:Size1,
> +                              (Size2 == Dynamic || Size2 == 
> Resizable)?Dynamic:Size2 >::test(s1, s2);
> +       }
> +};
> +
>  }
>
> Index: internal/vector.hh
> ===================================================================
> RCS file: /cvsroot/toon/TooN/internal/vector.hh,v
> retrieving revision 1.49
> retrieving revision 1.50
> diff -u -b -r1.49 -r1.50
> --- internal/vector.hh  27 Jul 2009 16:39:43 -0000      1.49
> +++ internal/vector.hh  7 Sep 2009 11:13:15 -0000       1.50
> @@ -126,6 +126,8 @@
>  **/
>  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
> @@ -230,6 +232,7 @@
>
>        /// 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++){
> @@ -241,6 +244,7 @@
>        /// 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++){
> @@ -252,6 +256,7 @@
>        /// 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: test/resize_test.cc
> diff -N test/resize_test.cc
> --- /dev/null   1 Jan 1970 00:00:00 -0000
> +++ test/resize_test.cc 7 Sep 2009 11:13:15 -0000       1.1
> @@ -0,0 +1,30 @@
> +#include <TooN/TooN.h>
> +using namespace std;
> +using namespace TooN;
> +
> +int main()
> +{
> +       Vector<Resizable> r;
> +       Vector<> v1(makeVector(1, 2));
> +
> +       r = v1;
> +       cout << r << endl;
> +       Vector<3> v2 = makeVector(2, 3, 4);
> +       r = v2;
> +       cout << r << endl;
> +
> +       r = Ones(10);
> +
> +       cout << r << endl;
> +
> +       r = makeVector(6, 7, 8, 9, 0);
> +       cout << r << endl;
> +
> +       r.resize(2);
> +       r[0]= 5;
> +       r[1] = 6;
> +
> +       cout << r << endl;
> +
> +
> +}
>
>
> _______________________________________________
> Toon-members mailing list
> address@hidden
> http://lists.nongnu.org/mailman/listinfo/toon-members
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]