Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

SubSVec.cc

Go to the documentation of this file.
00001 /*
00002     File:           SubSVec.cc
00003 
00004     Function:       Implements SubSVec.h
00005 
00006     Author(s):      Andrew Willmott
00007 
00008     Copyright:      (c) 1995-2000, Andrew Willmott
00009 
00010     Notes:          
00011                     
00012 */
00013 
00014 
00015 #include "vl/SubSVec.h"
00016 #include "vl/SparseVec.h"
00017 
00018 
00019 // --- Vector Memory Management -----------------------------------------------
00020 
00021 
00022 TSubSVec::TSubSVec(Int start, Int length, TSparseVec *target, Int span) :
00023     start(start), elts(length), target(target)
00024 {
00025     if (span == 1)
00026     {
00027         colSpan = 1;
00028         rowSpan = 0;
00029     }       
00030     else
00031     {
00032         rowSpan = span / target->Elts();
00033         colSpan = span % target->Elts();
00034     }
00035 }
00036 
00037 TSubSVec::TSubSVec(const TSubSVec &v) : elts(v.elts), start(v.start),
00038     colSpan(v.colSpan), rowSpan(v.rowSpan), target(v.target)
00039 {
00040 }
00041 
00042 TSubSVec &TSubSVec::operator = (const TSparseVec &v)
00043 {
00044     if (rowSpan)
00045     {
00046         TSVIter j;
00047         
00048         for (j.Begin(v); !j.AtEnd(); j.Inc())
00049             target[j.Index() * rowSpan]
00050                 .Set(start + j.Index() * colSpan, j.Data());
00051     }
00052     else
00053     {
00054         Int         i, srcSize, dstSize, cstart, k;
00055         TSVIter     j(target[0]);
00056 
00057         // find indices of the first & last ...
00058                 
00059         srcSize = v.NumItems() - 1;
00060         j.IncTo(start);
00061         cstart = j.PairIdx();
00062         j.IncTo(start + colSpan * v.Elts());
00063         dstSize = j.PairIdx() - cstart;
00064 
00065         // resize the hole in the index/elt array
00066 
00067         if (srcSize > dstSize)
00068             target->Insert(cstart, srcSize - dstSize);
00069         else if (dstSize > srcSize)
00070             target->Delete(cstart, dstSize - srcSize);
00071         
00072         // copy over the source vector pairs
00073         
00074         for (i = 0, k = cstart; i < srcSize; i++, k++)
00075         {
00076             target->Item(k).elt = v.Item(i).elt;
00077             target->Item(k).index = v.Item(i).index + start;
00078         }
00079     }
00080     
00081     return(SELF);
00082 }
00083 
00084 TSubSVec &TSubSVec::operator = (const TSubSVec &v)
00085 {
00086     // for the moment, use a cast... inefficient! XXX
00087     
00088     return(SELF = TSparseVec(v));
00089 }
00090 
00091 Void TSubSVec::Store(TSparseVec &sv) const
00092 {
00093     sv.SetNumElts(Elts());
00094     sv.Begin();
00095     
00096     if (rowSpan)
00097     {
00098         Int     i, ccol = start;
00099         
00100         for (i = 0; i < Elts(); i++)
00101         {
00102             // We only want one element from each SparseVec, so
00103             // use Get()...
00104             sv.AddElt(i, target[i].Get(ccol));
00105             ccol += colSpan;
00106         }
00107     }
00108     else
00109     {
00110         Int     endIndex = start + elts * colSpan;
00111         TSVIter j(target[0]);
00112 
00113         for (j.IncTo(start); j.PairIdx() < endIndex; j.Inc())
00114             sv.AddNZElt(j.Index() - start, j.Data());
00115     }
00116     
00117     sv.End();
00118 }
00119 
00120 // --- Sub-vector function ----------------------------------------------------
00121 
00122 TSubSVec sub(const TSparseVec &v, Int start, Int length)
00123 {
00124     Assert(start >= 0 && length > 0 && start + length <= v.Elts(),
00125         "(sub(SparseVec)) illegal subset of vector");
00126 
00127     return(TSubSVec(start, length, (TSparseVec*) &v));
00128 }
00129 

Generated at Sat Aug 5 00:16:48 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000