Ignore:
Timestamp:
Oct 5, 2009, 8:51:24 PM (16 years ago)
Author:
Frederik Heber <heber@…>
Children:
d40b96
Parents:
424d1ce
Message:

Member functions of Vector class may be called while going over an iteration of a list containing Vectors, thanks to member function pointers.

  • Unit test ActOnAllTest is the basic class for showing, how we can use any member function of Vector:: and make it act globally over a list of vectors.
  • this is incorporated into the definition of class molecule for the vectors contained in the atoms chained list.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • molecuilder/src/ActOnAlltest.hpp

    r424d1ce r4bc937  
    2020public:
    2121  VectorList();
     22  VectorList(VectorList &ref);
    2223  ~VectorList();
    2324
     
    2526  void EmptyList();
    2627
    27   template <T> void ActOnAllVectors( void (*f)(T) )
     28  template <typename res, typename T> void ActOnAllVectors( res (Vector::*f)(T), T t );
     29  template <typename res, typename T, typename U> void ActOnAllVectors( res (Vector::*f)(T, U), T t, U u );
     30  template <typename res, typename T, typename U, typename V> void ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v);
    2831
    29 private:
     32  bool operator == (VectorList &rhs);
     33  VectorList& operator = (VectorList &ref);
     34
     35//private:
    3036  ListOfVectors Vectors;
    3137};
    3238
    33 template <T> void VectorList::ActOnAllVectors( void (*f)(T) )
     39
     40VectorList::VectorList() { };
     41VectorList::VectorList(VectorList &ref)
    3442{
    35   for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++)
    36     f(T);
     43  ref.EmptyList();
     44  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++) {
     45    ref.Vectors.push_back(new Vector (**Runner));
     46  }
     47};
     48
     49VectorList & VectorList::operator = (VectorList &ref)
     50{
     51  EmptyList();
     52  for (ListOfVectors::iterator Runner = ref.Vectors.begin(); Runner != ref.Vectors.end(); Runner++) {
     53    Vectors.push_back(new Vector (**Runner));
     54  }
     55  return *this;
     56};
     57
     58bool VectorList::operator == (VectorList &rhs)
     59{
     60  bool status = true;
     61  ListOfVectors::iterator lRunner = Vectors.begin();
     62  ListOfVectors::iterator rRunner = rhs.Vectors.begin();
     63  for (;(lRunner != Vectors.end()) && (rRunner != rhs.Vectors.end()); lRunner++, rRunner++) {
     64    //cout << **lRunner << " == " << **rRunner << endl;
     65    status = status && (**lRunner == **rRunner);
     66  }
     67  return status;
     68};
     69
     70VectorList::~VectorList() { };
     71
     72template <typename res, typename T> void VectorList::ActOnAllVectors( res (Vector::*f)(T), T t )
     73{
     74  Vector *test = NULL;
     75  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++) {
     76    test = *Runner;
     77    (test->*f)(t);
     78  }
     79};
     80
     81template <typename res, typename T, typename U> void VectorList::ActOnAllVectors( res (Vector::*f)(T, U), T t, U u )
     82{
     83  Vector *test = NULL;
     84  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++) {
     85    test = *Runner;
     86    (test->*f)(t, u);
     87  }
     88};
     89
     90template <typename res, typename T, typename U, typename V> void VectorList::ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v)
     91{
     92  Vector *test = NULL;
     93  for (ListOfVectors::iterator Runner = Vectors.begin(); Runner != Vectors.end(); Runner++) {
     94    test = *Runner;
     95    (test->*f)(t, u, v);
     96  }
    3797};
    3898
Note: See TracChangeset for help on using the changeset viewer.