00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00041 #ifndef MOBJECT_SESSION_LOCATINGPIN_H
00042 #define MOBJECT_SESSION_LOCATINGPIN_H
00043
00044
00045 #include "proc/lumiera.hpp"
00046
00047 #include <utility>
00048 #include <tr1/memory>
00049 #include <boost/scoped_ptr.hpp>
00050 using boost::scoped_ptr;
00051
00052
00053
00054 namespace asset { class Pipe; }
00055
00056 namespace mobject
00057 {
00058 class MObject;
00059 template<class MO> class Placement;
00060 typedef Placement<MObject> PMO;
00061
00062 namespace session
00063 {
00064 class FixedLocation;
00065 class RelativeLocation;
00066
00067
00068
00081 class LocatingPin
00082 {
00083 protected:
00084 typedef lumiera::Time Time;
00085 typedef Time* Track;
00086 typedef std::tr1::shared_ptr<asset::Pipe> Pipe;
00087 typedef std::pair<Time,Pipe> SolutionData;
00088 struct LocatingSolution;
00089
00091 scoped_ptr<LocatingPin> next_;
00092
00094 virtual int getPrioLevel () const { return 0; }
00095
00096 LocatingPin& addChain (LocatingPin*);
00097 void resolve (LocatingSolution&) const;
00098 virtual void intersect (LocatingSolution&) const;
00099
00100 public:
00101 const SolutionData resolve () const;
00102 bool isOverdetermined () const;
00103
00104
00105
00106 FixedLocation& operator() (Time start, Track track=0);
00107 RelativeLocation& operator() (PMO refObj, Time offset=0);
00108
00109 LocatingPin (const LocatingPin&);
00110 LocatingPin& operator= (const LocatingPin&);
00111 virtual LocatingPin* clone () const;
00112 virtual ~LocatingPin() {};
00113
00114
00115 LocatingPin () {};
00116
00117
00118 protected:
00119
00120 friend class Placement<MObject>;
00121
00130 struct LocatingSolution
00131 {
00132 Time minTime;
00133 Time maxTime;
00134 Track minTrack;
00135 Track maxTrack;
00136 bool impo;
00137
00138 LocatingSolution ()
00139 : minTime(Time::MAX),
00140 maxTime(Time::MIN),
00141 minTrack(0),
00142 maxTrack(0),
00143 impo(false)
00144 { }
00145
00146 Time getTime ();
00147 Pipe getPipe ();
00148
00149 bool is_definite ();
00150 bool is_impossible ();
00151 bool still_to_solve ();
00152
00153 };
00154 };
00155
00156
00157
00158
00159 }
00160
00161 }
00162 #endif