]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/layout.h
Reduce interface clutter in Layout by storing Objects in a uniform way
[r2c2.git] / source / libr2c2 / layout.h
index de5588cefb98449790a8f4ca3923c868399acbaf..f9a2ba1bd5f7cf73f06dbd39956c0afa4166cffb 100644 (file)
@@ -44,21 +44,41 @@ public:
                void zone();
        };
 
+private:
+       template<typename B>
+       class Storage
+       {
+       private:
+               std::set<B *> base;
+               mutable std::list<Msp::Variant> caches;
+
+       public:
+               ~Storage();
+
+               bool insert(B &);
+               bool erase(B &);
+
+               const std::set<B *> &get() const { return base; }
+
+               template<typename T>
+               const std::set<T *> &get() const;
+
+               template<typename T>
+               void del();
+       };
+
+public:
        typedef std::set<Zone *> ZoneSet;
        typedef std::vector<Zone *> ZoneArray;
 
-       sigc::signal<void, Track &> signal_track_added;
-       sigc::signal<void, Track &> signal_track_removed;
-       sigc::signal<void, Signal &> signal_signal_added;
-       sigc::signal<void, Signal &> signal_signal_removed;
+       sigc::signal<void, Object &> signal_object_added;
+       sigc::signal<void, Object &> signal_object_removed;
        sigc::signal<void, Route &> signal_route_added;
        sigc::signal<void, Route &> signal_route_removed;
        sigc::signal<void, Zone &> signal_zone_added;
        sigc::signal<void, Zone &> signal_zone_removed;
        sigc::signal<void, Train &> signal_train_added;
        sigc::signal<void, Train &> signal_train_removed;
-       sigc::signal<void, Vehicle &> signal_vehicle_added;
-       sigc::signal<void, Vehicle &> signal_vehicle_removed;
        sigc::signal<void, Block &, Train *> signal_block_reserved;
        sigc::signal<void, Sensor &, Sensor::State> signal_sensor_state_changed;
        sigc::signal<void, const std::string &> signal_emergency;
@@ -67,14 +87,12 @@ private:
        Catalogue &catalogue;
        Driver *driver;
        std::string base;
-       std::set<Track *> tracks;
-       std::set<Signal *> signals;
+       Storage<Object> objects;
        std::set<Route *> routes;
        ZoneSet zones;
        std::set<Block *> blocks;
        std::set<Sensor *> sensors;
        std::map<unsigned, Train *> trains;
-       std::set<Vehicle *> vehicles;
        Msp::Time::TimeStamp last_tick;
        unsigned next_turnout_id;
 
@@ -87,24 +105,20 @@ public:
        Driver &get_driver() const;
        const std::string &get_base() const { return base; }
 
-       void add_track(Track &);
-       const std::set<Track *> &get_tracks() const { return tracks; }
-       Track *pick_track(const Ray &);
-       void remove_track(Track &);
-       unsigned allocate_turnout_id();
-
-       void add_signal(Signal &);
-       const std::set<Signal *> &get_signals() const { return signals; }
-       Signal *pick_signal(const Ray &);
-       void remove_signal(Signal &);
+       void add(Object &);
+       void add(Track &);
 
-       Object *pick_object(const Ray &);
+       template<typename T>
+       const std::set<T *> &get_all() const;
 
-private:
        template<typename T>
-       static T *pick(const std::set<T *> &, const Ray &);
+       T *pick(const Ray &);
+
+       void remove(Object &);
+       void remove(Track &);
+
+       unsigned allocate_turnout_id();
 
-public:
        void add_block(Block &);
        Block &get_block(unsigned) const;
        const std::set<Block *> &get_blocks() const { return blocks; }
@@ -129,9 +143,6 @@ public:
        const std::map<unsigned, Train *> &get_trains() const { return trains; }
        void remove_train(Train &);
 
-       void add_vehicle(Vehicle &);
-       void remove_vehicle(Vehicle &);
-
        void add_sensor(Sensor &);
        void remove_sensor(Sensor &);