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