00001 /* 00002 File: SubVec.h 00003 00004 Function: Defines a scatter-gather vector, i.e., a subvector of another vector, 00005 or the row, column or diagonal of a matrix. 00006 00007 Author(s): Andrew Willmott 00008 00009 Copyright: (c) 1995-2000, Andrew Willmott 00010 */ 00011 00012 #ifndef __SubVec__ 00013 #define __SubVec__ 00014 00015 #include "vl/VL.h" 00016 00017 class TVec; 00018 00019 class TSubVec 00020 { 00021 public: 00022 00023 TSubVec(Int n, Int span, TVReal data[]); 00024 TSubVec(const TSubVec &v); 00025 TSubVec(const TVec &v); 00026 00027 inline Int Elts() const { return(elts); }; 00028 00029 inline TVReal &operator [] (Int i); 00030 inline TVReal operator [] (Int i) const; 00031 00032 TSubVec &operator = (const TSubVec &v); 00033 TSubVec &operator = (const TVec &v); 00034 00035 Int elts; 00036 Int span; 00037 TVReal *data; 00038 }; 00039 00040 inline TSubVec sub(const TSubVec &v, Int start, Int length); 00041 inline TSubVec first(const TSubVec &v, Int length); 00042 inline TSubVec last(const TSubVec &v, Int length); 00043 00044 00045 // --- SubVec In-Place operators ---------------------------------------------- 00046 00047 TSubVec &operator += (TSubVec &a, const TSubVec &b); 00048 TSubVec &operator -= (TSubVec &a, const TSubVec &b); 00049 TSubVec &operator *= (TSubVec &a, const TSubVec &b); 00050 TSubVec &operator *= (TSubVec &v, TVReal s); 00051 TSubVec &operator /= (TSubVec &a, const TSubVec &b); 00052 TSubVec &operator /= (TSubVec &v, TVReal s); 00053 00054 00055 // --- Inlines ---------------------------------------------------------------- 00056 00057 inline TVReal &TSubVec::operator [] (Int i) 00058 { 00059 CheckRange(i, 0, elts, "Vec::[i]"); 00060 00061 return(data[i * span]); 00062 } 00063 00064 inline TVReal TSubVec::operator [] (Int i) const 00065 { 00066 CheckRange(i, 0, elts, "Vec::[i]"); 00067 00068 return(data[i * span]); 00069 } 00070 00071 inline TSubVec sub(const TSubVec &v, Int start, Int length) 00072 { 00073 Assert(start >= 0 && length > 0 && start + length <= v.Elts(), 00074 "(sub(Vec)) illegal subset of vector"); 00075 00076 return(TSubVec(length, v.span, v.data + start * v.span)); 00077 } 00078 00079 inline TSubVec first(const TSubVec &v, Int length) 00080 { 00081 Assert(length > 0 && length <= v.Elts(), 00082 "(first(Vec)) illegal subset of vector"); 00083 00084 return(TSubVec(length, v.span, v.data)); 00085 } 00086 00087 inline TSubVec last(const TSubVec &v, Int length) 00088 { 00089 Assert(length > 0 && length <= v.Elts(), 00090 "(last(Vec)) illegal subset of vector"); 00091 00092 return(TSubVec(length, v.span, v.data + (v.elts - length) * v.span)); 00093 } 00094 00095 #endif