// This may look like C code, but it is really -*- C++ -*- /* Copyright (C) 1988 Free Software Foundation written by Doug Lea (dl@rocky.oswego.edu) This file is part of the GNU C++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef __GNUG__ #pragma implementation #endif #include #include #include ".AVec.h" /* The following brought to you by the department of redundancy department */ AVec& AVec::operator = (AVec& v) { if (len != 0 && len != v.capacity()) error("nonconformant vectors."); if (len == 0) s = new [len = v.capacity()]; if (s != v.vec()) { for (int i = 0; i < len; ++i) s[i] = v.vec()[i]; } return *this; } AVec& AVec::operator = ( f) { for (int i = 0; i < len; ++i) s[i] = f; return *this; } AVec concat(AVec & a, AVec & b) { int newl = a.capacity() + b.capacity(); * news = new [newl]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); while (t < top) *p++ = *t++; top = &(b.vec()[b.capacity()]); t = b.vec(); while (t < top) *p++ = *t++; return AVec(newl, news); } AVec combine(Combiner f, AVec& a, AVec& b) { int newl = (a.capacity() < b.capacity())? a.capacity() : b.capacity(); * news = new [newl]; * p = news; * top = &(a.vec()[newl]); * t = a.vec(); * u = b.vec(); while (t < top) *p++ = (*f)(*t++, *u++); return AVec(newl, news); } AVec reverse(AVec& a) { * news = new [a.capacity()]; if (a.capacity() != 0) { * lo = news; * hi = &(news[a.capacity() - 1]); while (lo < hi) { tmp = *lo; *lo++ = *hi; *hi-- = tmp; } } return AVec(a.capacity(), news); } AVec map(Mapper f, AVec& a) { * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); while(t < top) *p++ = (*f)(*t++); return AVec(a.capacity(), news); } AVec AVec::at(int from, int n) { int to; if (n < 0) { n = len - from; to = len - 1; } else to = from + n - 1; if ((unsigned)from > (unsigned)to) range_error(); * news = new [n]; * p = news; * t = &(s[from]); * top = &(s[to]); while (t <= top) *p++ = *t++; return AVec(n, news); } AVec merge(AVec & a, AVec & b, Comparator f) { int newl = a.capacity() + b.capacity(); * news = new [newl]; * p = news; * topa = &(a.vec()[a.capacity()]); * as = a.vec(); * topb = &(b.vec()[b.capacity()]); * bs = b.vec(); for (;;) { if (as >= topa) { while (bs < topb) *p++ = *bs++; break; } else if (bs >= topb) { while (as < topa) *p++ = *as++; break; } else if ((*f)(*as, *bs) <= 0) *p++ = *as++; else *p++ = *bs++; } return AVec(newl, news); } AVec operator + (AVec& a, AVec& b) { a.check_len(b.capacity()); * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); * u = b.vec(); while (t < top) *p++ = *t++ + *u++; return AVec(a.capacity(), news); } AVec operator - (AVec& a, AVec& b) { a.check_len(b.capacity()); * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); * u = b.vec(); while (t < top) *p++ = *t++ - *u++; return AVec(a.capacity(), news); } AVec product (AVec& a, AVec& b) { a.check_len(b.capacity()); * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); * u = b.vec(); while (t < top) *p++ = *t++ * *u++; return AVec(a.capacity(), news); } AVec quotient(AVec& a, AVec& b) { a.check_len(b.capacity()); * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); * u = b.vec(); while (t < top) *p++ = *t++ / *u++; return AVec(a.capacity(), news); } AVec operator + (AVec& a, b) { * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); while (t < top) *p++ = *t++ + b; return AVec(a.capacity(), news); } AVec operator - (AVec& a, b) { * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); while (t < top) *p++ = *t++ - b; return AVec(a.capacity(), news); } AVec operator * (AVec& a, b) { * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); while (t < top) *p++ = *t++ * b; return AVec(a.capacity(), news); } AVec operator / (AVec& a, b) { * news = new [a.capacity()]; * p = news; * top = &(a.vec()[a.capacity()]); * t = a.vec(); while (t < top) *p++ = *t++ / b; return AVec(a.capacity(), news); } AVec AVec::operator - () { * news = new [len]; * p = news; * top = &(s[len]); * t = s; while (t < top) *p++ = -(*t++); return AVec(len, news); } AVec& AVec::operator += (AVec& b) { check_len(b.capacity()); * u = b.vec(); * top = &(s[len]); * t = s; while (t < top) *t++ += *u++; return *this; } AVec& AVec::operator -= (AVec& b) { check_len(b.capacity()); * u = b.vec(); * top = &(s[len]); * t = s; while (t < top) *t++ -= *u++; return *this; } AVec& AVec::product(AVec& b) { check_len(b.capacity()); * u = b.vec(); * top = &(s[len]); * t = s; while (t < top) *t++ *= *u++; return *this; } AVec& AVec::quotient(AVec& b) { check_len(b.capacity()); * u = b.vec(); * top = &(s[len]); * t = s; while (t < top) *t++ /= *u++; return *this; } AVec& AVec::operator += ( b) { * top = &(s[len]); * t = s; while (t < top) *t++ += b; return *this; } AVec& AVec::operator -= ( b) { * top = &(s[len]); * t = s; while (t < top) *t++ -= b; return *this; } AVec& AVec::operator *= ( b) { * top = &(s[len]); * t = s; while (t < top) *t++ *= b; return *this; } AVec& AVec::operator /= ( b) { * top = &(s[len]); * t = s; while (t < top) *t++ /= b; return *this; } AVec::max() { if (len == 0) return 0; * top = &(s[len]); * t = s; res = *t++; for (; t < top; ++t) if (*t > res) res = *t; return res; } int AVec::max_index() { if (len == 0) return -1; int ind = 0; for (int i = 1; i < len; ++i) if (s[i] > s[ind]) ind = i; return ind; } AVec::min() { if (len == 0) return 0; * top = &(s[len]); * t = s; res = *t++; for (; t < top; ++t) if (*t < res) res = *t; return res; } int AVec::min_index() { if (len == 0) return -1; int ind = 0; for (int i = 1; i < len; ++i) if (s[i] < s[ind]) ind = i; return ind; } AVec::sum() { res = 0; * top = &(s[len]); * t = s; while (t < top) res += *t++; return res; } AVec::sumsq() { res = 0; * top = &(s[len]); * t = s; for (; t < top; ++t) res += *t * *t; return res; } operator * (AVec& a, AVec& b) { a.check_len(b.capacity()); * top = &(a.vec()[a.capacity()]); * t = a.vec(); * u = b.vec(); res = 0; while (t < top) res += *t++ * *u++; return res; }