home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / libg_ / libgpp / !libgpp / gen / ccp / AVec next >
Text File  |  1995-06-16  |  8KB  |  398 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2. /* 
  3. Copyright (C) 1988 Free Software Foundation
  4.     written by Doug Lea (dl@rocky.oswego.edu)
  5.  
  6. This file is part of the GNU C++ Library.  This library is free
  7. software; you can redistribute it and/or modify it under the terms of
  8. the GNU Library General Public License as published by the Free
  9. Software Foundation; either version 2 of the License, or (at your
  10. option) any later version.  This library is distributed in the hope
  11. that it will be useful, but WITHOUT ANY WARRANTY; without even the
  12. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  13. PURPOSE.  See the GNU Library General Public License for more details.
  14. You should have received a copy of the GNU Library General Public
  15. License along with this library; if not, write to the Free Software
  16. Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18.  
  19. #ifdef __GNUG__
  20. #pragma implementation
  21. #endif
  22. #include <stream.h>
  23. #include <builtin.h>
  24. #include "<T>.AVec.h"
  25.  
  26. /*
  27.  The following brought to you by the department of redundancy department
  28. */
  29.  
  30. <T>AVec& <T>AVec::operator = (const <T>AVec& v)
  31. {
  32.   if (len != 0 && len != v.capacity())
  33.     error("nonconformant vectors.");
  34.   if (len == 0)
  35.     s = new <T> [len = v.capacity()];
  36.   if (s != v.vec())
  37.   {
  38.     for (int i = 0; i < len; ++i)
  39.       s[i] = v.vec()[i];
  40.   }
  41.   return *this;
  42. }
  43.  
  44. <T>AVec& <T>AVec::operator = (<T&> f)
  45. {
  46.   for (int i = 0; i < len; ++i) s[i] = f;
  47.   return *this;
  48. }
  49.  
  50.  
  51. <T>AVec concat(<T>AVec & a, <T>AVec & b)
  52. {
  53.   int newl = a.capacity() + b.capacity();
  54.   <T>* news = new <T> [newl];
  55.   <T>* p = news;
  56.   <T>* top = &(a.vec()[a.capacity()]);
  57.   <T>* t = a.vec();
  58.   while (t < top) *p++ = *t++;
  59.   top = &(b.vec()[b.capacity()]);
  60.   t = b.vec();
  61.   while (t < top) *p++ = *t++;
  62.   return <T>AVec(newl, news);
  63. }
  64.  
  65.  
  66. <T>AVec combine(<T>Combiner f, <T>AVec& a, <T>AVec& b)
  67. {
  68.   int newl = (a.capacity() < b.capacity())? a.capacity() : b.capacity();
  69.   <T>* news = new <T> [newl];
  70.   <T>* p = news;
  71.   <T>* top = &(a.vec()[newl]);
  72.   <T>* t = a.vec();
  73.   <T>* u = b.vec();
  74.   while (t < top) *p++ = (*f)(*t++, *u++);
  75.   return <T>AVec(newl, news);
  76. }
  77.  
  78. <T>AVec reverse(<T>AVec& a)
  79. {
  80.   <T>* news = new <T> [a.capacity()];
  81.   if (a.capacity() != 0)
  82.   {
  83.     <T>* lo = news;
  84.     <T>* hi = &(news[a.capacity() - 1]);
  85.     while (lo < hi)
  86.     {
  87.       <T> tmp = *lo;
  88.       *lo++ = *hi;
  89.       *hi-- = tmp;
  90.     }
  91.   }
  92.   return <T>AVec(a.capacity(), news);
  93. }
  94.  
  95. <T>AVec map(<T>Mapper f, <T>AVec& a)
  96. {
  97.   <T>* news = new <T> [a.capacity()];
  98.   <T>* p = news;
  99.   <T>* top = &(a.vec()[a.capacity()]);
  100.   <T>* t = a.vec();
  101.   while(t < top) *p++ = (*f)(*t++);
  102.   return <T>AVec(a.capacity(), news);
  103. }
  104.  
  105. <T>AVec <T>AVec::at(int from, int n)
  106. {
  107.   int to;
  108.   if (n < 0)
  109.   {
  110.     n = len - from;
  111.     to = len - 1;
  112.   }
  113.   else
  114.     to = from + n - 1;
  115.   if ((unsigned)from > (unsigned)to)
  116.     range_error();
  117.   <T>* news = new <T> [n];
  118.   <T>* p = news;
  119.   <T>* t = &(s[from]);
  120.   <T>* top = &(s[to]);
  121.   while (t <= top) *p++ = *t++;
  122.   return <T>AVec(n, news);
  123. }
  124.  
  125. <T>AVec merge(<T>AVec & a, <T>AVec & b, <T>Comparator f)
  126. {
  127.   int newl = a.capacity() + b.capacity();
  128.   <T>* news = new <T> [newl];
  129.   <T>* p = news;
  130.   <T>* topa = &(a.vec()[a.capacity()]);
  131.   <T>* as = a.vec();
  132.   <T>* topb = &(b.vec()[b.capacity()]);
  133.   <T>* bs = b.vec();
  134.  
  135.   for (;;)
  136.   {
  137.     if (as >= topa)
  138.     {
  139.       while (bs < topb) *p++ = *bs++;
  140.       break;
  141.     }
  142.     else if (bs >= topb)
  143.     {
  144.       while (as < topa) *p++ = *as++;
  145.       break;
  146.     }
  147.     else if ((*f)(*as, *bs) <= 0)
  148.       *p++ = *as++;
  149.     else
  150.       *p++ = *bs++;
  151.   }
  152.   return <T>AVec(newl, news);
  153. }
  154.  
  155. <T>AVec operator + (<T>AVec& a, <T>AVec& b)
  156. {
  157.   a.check_len(b.capacity());
  158.   <T>* news = new <T> [a.capacity()];
  159.   <T>* p = news;
  160.   <T>* top = &(a.vec()[a.capacity()]);
  161.   <T>* t = a.vec();
  162.   <T>* u = b.vec();
  163.   while (t < top) *p++ = *t++ + *u++;
  164.   return <T>AVec(a.capacity(), news);
  165. }
  166.  
  167. <T>AVec operator - (<T>AVec& a, <T>AVec& b)
  168. {
  169.   a.check_len(b.capacity());
  170.   <T>* news = new <T> [a.capacity()];
  171.   <T>* p = news;
  172.   <T>* top = &(a.vec()[a.capacity()]);
  173.   <T>* t = a.vec();
  174.   <T>* u = b.vec();
  175.   while (t < top) *p++ = *t++ - *u++;
  176.   return <T>AVec(a.capacity(), news);
  177. }
  178.  
  179. <T>AVec  product (<T>AVec& a, <T>AVec& b)
  180. {
  181.   a.check_len(b.capacity());
  182.   <T>* news = new <T> [a.capacity()];
  183.   <T>* p = news;
  184.   <T>* top = &(a.vec()[a.capacity()]);
  185.   <T>* t = a.vec();
  186.   <T>* u = b.vec();
  187.   while (t < top) *p++ = *t++ * *u++;
  188.   return <T>AVec(a.capacity(), news);
  189. }
  190.  
  191. <T>AVec quotient(<T>AVec& a, <T>AVec& b)
  192. {
  193.   a.check_len(b.capacity());
  194.   <T>* news = new <T> [a.capacity()];
  195.   <T>* p = news;
  196.   <T>* top = &(a.vec()[a.capacity()]);
  197.   <T>* t = a.vec();
  198.   <T>* u = b.vec();
  199.   while (t < top) *p++ = *t++ / *u++;
  200.   return <T>AVec(a.capacity(), news);
  201. }
  202.  
  203. <T>AVec operator + (<T>AVec& a, <T&> b)
  204. {
  205.   <T>* news = new <T> [a.capacity()];
  206.   <T>* p = news;
  207.   <T>* top = &(a.vec()[a.capacity()]);
  208.   <T>* t = a.vec();
  209.   while (t < top) *p++ = *t++ + b;
  210.   return <T>AVec(a.capacity(), news);
  211. }
  212.  
  213. <T>AVec operator - (<T>AVec& a, <T&> b)
  214. {
  215.   <T>* news = new <T> [a.capacity()];
  216.   <T>* p = news;
  217.   <T>* top = &(a.vec()[a.capacity()]);
  218.   <T>* t = a.vec();
  219.   while (t < top) *p++ = *t++ - b;
  220.   return <T>AVec(a.capacity(), news);
  221. }
  222.  
  223. <T>AVec operator * (<T>AVec& a, <T&> b)
  224. {
  225.   <T>* news = new <T> [a.capacity()];
  226.   <T>* p = news;
  227.   <T>* top = &(a.vec()[a.capacity()]);
  228.   <T>* t = a.vec();
  229.   while (t < top) *p++ = *t++ * b;
  230.   return <T>AVec(a.capacity(), news);
  231. }
  232.  
  233. <T>AVec operator / (<T>AVec& a, <T&> b)
  234. {
  235.   <T>* news = new <T> [a.capacity()];
  236.   <T>* p = news;
  237.   <T>* top = &(a.vec()[a.capacity()]);
  238.   <T>* t = a.vec();
  239.   while (t < top) *p++ = *t++ / b;
  240.   return <T>AVec(a.capacity(), news);
  241. }
  242.  
  243. <T>AVec <T>AVec::operator - ()
  244. {
  245.   <T>* news = new <T> [len];
  246.   <T>* p = news;
  247.   <T>* top = &(s[len]);
  248.   <T>* t = s;
  249.   while (t < top) *p++ = -(*t++);
  250.   return <T>AVec(len, news);
  251. }
  252.  
  253. <T>AVec& <T>AVec::operator += (<T>AVec& b)
  254. {
  255.   check_len(b.capacity());
  256.   <T>* u = b.vec();
  257.   <T>* top = &(s[len]);
  258.   <T>* t = s;
  259.   while (t < top) *t++ += *u++;
  260.   return *this;
  261. }
  262.  
  263. <T>AVec& <T>AVec::operator -= (<T>AVec& b)
  264. {
  265.   check_len(b.capacity());
  266.   <T>* u = b.vec();
  267.   <T>* top = &(s[len]);
  268.   <T>* t = s;
  269.   while (t < top) *t++ -= *u++;
  270.   return *this;
  271. }
  272.  
  273. <T>AVec& <T>AVec::product(<T>AVec& b)
  274. {
  275.   check_len(b.capacity());
  276.   <T>* u = b.vec();
  277.   <T>* top = &(s[len]);
  278.   <T>* t = s;
  279.   while (t < top) *t++ *= *u++;
  280.   return *this;
  281. }
  282.  
  283. <T>AVec& <T>AVec::quotient(<T>AVec& b)
  284. {
  285.   check_len(b.capacity());
  286.   <T>* u = b.vec();
  287.   <T>* top = &(s[len]);
  288.   <T>* t = s;
  289.   while (t < top) *t++ /= *u++;
  290.   return *this;
  291. }
  292.  
  293. <T>AVec& <T>AVec::operator += (<T&> b)
  294. {
  295.   <T>* top = &(s[len]);
  296.   <T>* t = s;
  297.   while (t < top) *t++ += b;
  298.   return *this;
  299. }
  300.  
  301. <T>AVec& <T>AVec::operator -= (<T&> b)
  302. {
  303.   <T>* top = &(s[len]);
  304.   <T>* t = s;
  305.   while (t < top) *t++ -= b;
  306.   return *this;
  307. }
  308.  
  309. <T>AVec& <T>AVec::operator *= (<T&> b)
  310. {
  311.   <T>* top = &(s[len]);
  312.   <T>* t = s;
  313.   while (t < top) *t++ *= b;
  314.   return *this;
  315. }
  316.  
  317. <T>AVec& <T>AVec::operator /= (<T&> b)
  318. {
  319.   <T>* top = &(s[len]);
  320.   <T>* t = s;
  321.   while (t < top) *t++ /= b;
  322.   return *this;
  323. }
  324.  
  325. <T> <T>AVec::max()
  326. {
  327.   if (len == 0)
  328.     return 0;
  329.   <T>* top = &(s[len]);
  330.   <T>* t = s;
  331.   <T> res = *t++;
  332.   for (; t < top; ++t) if (*t > res) res = *t;
  333.   return res;
  334. }
  335.  
  336. int <T>AVec::max_index()
  337. {
  338.   if (len == 0)
  339.     return -1;
  340.   int ind = 0;
  341.   for (int i = 1; i < len; ++i)
  342.     if (s[i] > s[ind])
  343.       ind = i;
  344.   return ind;
  345. }
  346.  
  347. <T> <T>AVec::min()
  348. {
  349.   if (len == 0)
  350.     return 0;
  351.   <T>* top = &(s[len]);
  352.   <T>* t = s;
  353.   <T> res = *t++;
  354.   for (; t < top; ++t) if (*t < res) res = *t;
  355.   return res;
  356. }
  357.  
  358. int <T>AVec::min_index()
  359. {
  360.   if (len == 0)
  361.     return -1;
  362.   int ind = 0;
  363.   for (int i = 1; i < len; ++i)
  364.     if (s[i] < s[ind])
  365.       ind = i;
  366.   return ind;
  367. }
  368.  
  369. <T> <T>AVec::sum()
  370. {
  371.   <T> res = 0;
  372.   <T>* top = &(s[len]);
  373.   <T>* t = s;
  374.   while (t < top) res += *t++;
  375.   return res;
  376. }
  377.  
  378.  
  379. <T> <T>AVec::sumsq()
  380. {
  381.   <T> res = 0;
  382.   <T>* top = &(s[len]);
  383.   <T>* t = s;
  384.   for (; t < top; ++t) res += *t * *t;
  385.   return res;
  386. }
  387.  
  388. <T> operator * (<T>AVec& a, <T>AVec& b)
  389. {
  390.   a.check_len(b.capacity());
  391.   <T>* top = &(a.vec()[a.capacity()]);
  392.   <T>* t = a.vec();
  393.   <T>* u = b.vec();
  394.   <T> res = 0;
  395.   while (t < top) res += *t++ * *u++;
  396.   return res;
  397. }
  398.