home *** CD-ROM | disk | FTP | other *** search
/ Borland Programmer's Resource / Borland_Programmers_Resource_CD_1995.iso / code / bcpp / file19 / tstvec.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-19  |  3.6 KB  |  136 lines

  1. ///////////////////////////////////////////////////////////////
  2. // tstvec.cpp: Vector test program using integer vector math.
  3. // Copyright(c) 1993 Azarona Software. All rights reserved.
  4. ///////////////////////////////////////////////////////////////
  5. #include <iostream.h>
  6. #include "vector.h"
  7.  
  8. //
  9. // Some sample vector math routines
  10. //
  11.  
  12. template<class TYPE>
  13. void operator+=(Vector<TYPE> &v, const TYPE &x)
  14. // Adds x to every element of v.
  15. // ASSUMES TYPE has '+=' defined.
  16. {
  17.   VecPtr<TYPE> elemptr(v.PtrToAll());
  18.   for (unsigned i = 0; i<v.Length(); i++) {
  19.       *elemptr += x;
  20.       elemptr++;
  21.   }
  22. }
  23.  
  24. template<class TYPE>
  25. void Add(Vector<TYPE> &r, const Vector<TYPE> &a, const Vector<TYPE> &b)
  26. // Adds vectors a and b together, storing result in r.
  27. // The number of elements added is determined by the
  28. // shortest length of all three vectors.
  29. // ASSUMES that TYPE has '+' defined.
  30. {
  31.   unsigned rlen = r.Length();
  32.   unsigned slen = a.Length();
  33.   if (rlen > slen) rlen = slen;
  34.   slen = b.Length();
  35.   if (rlen > slen) rlen = slen;
  36.   VecPtr<TYPE> rptr(r.PtrToAll());
  37.   VecPtr<const TYPE> aptr(a.PtrToAll());
  38.   VecPtr<const TYPE> bptr(b.PtrToAll());
  39.   for (unsigned i = 0; i<rlen; i++) {
  40.       *rptr = *aptr + *bptr;
  41.       rptr++;
  42.       aptr++;
  43.       bptr++;
  44.   }
  45. }
  46.  
  47. template<class TYPE>
  48. Vector<TYPE> operator+(const Vector<TYPE> &a, const Vector<TYPE> &b)
  49. // Adds vectors a and b together, returning the result (which
  50. // has its data allocated on the heap.) The number of elements
  51. // created is determined by the shortest length a and b.
  52. {
  53.   unsigned rlen = a.Length();
  54.   unsigned slen = b.Length();
  55.   if (rlen > slen) rlen = slen;
  56.   Vector<TYPE> result(rlen);
  57.   Add(result, a, b);
  58.   return result;
  59. }
  60.  
  61.  
  62. template<class TYPE>
  63. void PrtVec(const Vector<TYPE> &v)
  64. // Print out the elements of a vector
  65. {
  66.   VecPtr<const TYPE> cursor(v.PtrToAll());
  67.   unsigned i, len = v.Length();
  68.   for (i = 0; i<len; i++) {
  69.       cout << *cursor << ' ';
  70.       cursor++;
  71.   }
  72.   cout << '\n';
  73. }
  74.  
  75. // BC++ needs the next statements, which generate functions
  76. // for doing operations on vectors
  77.  
  78. void Add(Vector<int> &r, const Vector<int> &a, const Vector<int> &b);
  79. void operator+=(Vector<int> &v, const int &x);
  80. void PrtVec(const Vector<int> &v);
  81.  
  82. // You need one of these statements for each type of vector:
  83.  
  84. INITNULLVEC(int);
  85.  
  86. // A low-level C array we'll copy
  87.  
  88. const int arr_size = 7;
  89. int arr[arr_size] = {0, 1, 2, 3, 4, 5, 6};
  90.  
  91. void test()
  92. {
  93.   cout << "Creating a vector\n";
  94.  
  95.   Vector<int> myvec(arr_size, arr);
  96.   cout << "myvec: "; PrtVec(myvec);
  97.  
  98.   cout << "Creating a shared slice of every other element\n";
  99.  
  100.   Vector<int> everyother(myvec, SHARED, 4, 2);
  101.   cout << "everyother: "; PrtVec(everyother);
  102.  
  103.   cout << "Creating a copied slice of every other element\n";
  104.  
  105.   Vector<int> cpslice(myvec, COPIED, 4, 2);
  106.   cout << "cpslice: "; PrtVec(cpslice);
  107.  
  108.   cout << "Adding 10 to every other element\n";
  109.  
  110.   everyother += 10;
  111.   cout << "myvec:    "; PrtVec(myvec);
  112.   cout << "everyother:  "; PrtVec(everyother);
  113.   cout << "cpslice: "; PrtVec(cpslice);
  114.  
  115.   cout << "Adding all odd elements to even elements\n";
  116.  
  117.   Vector<int> odd(myvec, SHARED, 3, 2, 1);
  118.   Vector<int> even(myvec, SHARED, 4, 2, 0);
  119.  
  120.   cout << "Result:   "; PrtVec(odd + even);
  121.   cout << "myvec:    "; PrtVec(myvec);
  122.  
  123.   cout << "Testing consistency checks for stride, length, and offset\n";
  124.  
  125.   Vector<int> tstslice(everyother, SHARED, 4, 2, 1);
  126.   cout << "everyother:  "; PrtVec(everyother);
  127.   cout << "tstslice: "; PrtVec(tstslice);
  128. }
  129.  
  130. main()
  131. {
  132.   test();
  133.   return 0;
  134. }
  135.  
  136.