#include <cmath>
+#include <msp/datafile/collection.h>
#include <msp/geometry/union.h>
+#include "trackappearance.h"
#include "tracktype.h"
using namespace std;
namespace R2C2 {
-TrackType::TrackType(const ArticleNumber &an, const TrackAppearance &ta):
- ObjectType(an),
- appearance(ta),
+TrackType::TrackType():
+ appearance(0),
state_bits(0),
autofit_preference(1)
{ }
+const TrackAppearance &TrackType::get_appearance() const
+{
+ if(!appearance)
+ throw logic_error("no appearance");
+ return *appearance;
+}
+
+float TrackType::get_gauge() const
+{
+ return get_appearance().get_gauge();
+}
+
float TrackType::get_total_length() const
{
return get_path_length(-1);
return n;
}
+unsigned TrackType::coerce_path(unsigned entry, unsigned path) const
+{
+ const Endpoint &ep = get_endpoint(entry);
+ if(ep.has_path(path))
+ return path;
+
+ unsigned paths = get_paths();
+ if(paths>>(1<<state_bits))
+ {
+ /* There are more paths than can be expressed with state_bits, so
+ multiple paths are set at once. See if one of the alternatives fits. */
+ unsigned step = 1<<state_bits;
+ for(unsigned p=path+step; paths>>p; p+=step)
+ if(ep.has_path(p))
+ return p;
+ }
+
+ // Find an endpoint that's connected to the entry and has the requested path
+ for(vector<Endpoint>::const_iterator i=endpoints.begin(); i!=endpoints.end(); ++i)
+ if(i->has_path(path) && i->has_common_paths(ep))
+ {
+ unsigned p = 1;
+ for(unsigned m=i->paths&ep.paths; m>>p; ++p) ;
+ return p-1;
+ }
+
+ // TODO crossings fall here
+ throw logic_error("TrackType::coerce_path");
+}
+
bool TrackType::is_turnout() const
{
return endpoints.size()>2;
{ }
-TrackType::Loader::Loader(TrackType &t):
+TrackType::Loader::Loader(TrackType &t, Collection &c):
DataFile::DerivedObjectLoader<TrackType, ObjectType::Loader>(t),
+ coll(c),
state_bits_set(false)
{
+ add("appearance", &TrackType::appearance);
add("autofit_preference", &TrackType::autofit_preference);
add("object", &TrackType::object);
add("state_bits", &Loader::state_bits);