1 /*****
2  * guide.cc
3  * Andy Hammerlindl 2005/02/23
4  *
5  *****/
6 
7 #include "guide.h"
8 
9 namespace camp {
10 
multiguide(guidevector & v)11 multiguide::multiguide(guidevector& v)
12 {
13     // This constructor tests if the first subguide is also a multiguide and,
14     // if possible, uses the same base, extending it beyond what is used.
15     multiguide *rg = v.empty() ? 0 : dynamic_cast<multiguide *>(v[0]);
16     if (rg && rg->base->size() == rg->length) {
17         base = rg->base;
18         base->insert(base->end(), v.begin()+1, v.end());
19     }
20     else
21         base = new guidevector(v);
22 
23     length = base->size();
24 }
25 
flatten(flatguide & g,bool allowsolve)26 void multiguide::flatten(flatguide& g, bool allowsolve)
27 {
28   size_t n=length;
29   if(n > 0) {
30     for(size_t i=0; i+1 < n; ++i) {
31       subguide(i)->flatten(g,allowsolve);
32       if(!allowsolve && subguide(i)->cyclic()) {
33         g.precyclic(true);
34         g.resolvecycle();
35       }
36     }
37     subguide(n-1)->flatten(g,allowsolve);
38   }
39 }
40 
print(ostream & out) const41 void multiguide::print(ostream& out) const
42 {
43   side lastLoc=JOIN;
44   for(size_t i=0; i < length; ++i) {
45     guide *g = subguide(i);
46     side loc = g->printLocation();
47     adjustLocation(out,lastLoc,loc);
48     g->print(out);
49     lastLoc=loc;
50   }
51 }
52 
53 } // namespace camp
54