Layer.hh 2.33 KB
Newer Older
filatov's avatar
filatov committed
1
2
#ifndef LAYER_HH
#define LAYER_HH
filatov's avatar
filatov committed
3
4
5
6
#include <string>
#include <map>
#include <vector>

7
8
#include "Params.hh"

filatov's avatar
filatov committed
9
10
11
12
13
14
15
class OCTETSTRING;

class Layer {
  std::vector<Layer*> upperLayers;
  std::vector<Layer*> lowerLayers;
  public:
    Layer(){}
garciay's avatar
garciay committed
16
17
    virtual ~Layer() {};
    void deleteLayer() {};
filatov's avatar
filatov committed
18
  public:
garciay's avatar
garciay committed
19
20
    void addUpperLayer(Layer*) {};
    void removeUpperLayer(Layer*) {};
filatov's avatar
filatov committed
21

garciay's avatar
garciay committed
22
23
    virtual void sendData(const OCTETSTRING& data, const Params& params) {};
    virtual void receiveData(const OCTETSTRING& data, const Params& info) {};
filatov's avatar
filatov committed
24
25

  protected:
garciay's avatar
garciay committed
26
    void toAllLayers(std::vector<Layer*>&layers, const OCTETSTRING& data, const Params& info) {};
filatov's avatar
filatov committed
27
28
    inline void toAllUpperLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
    inline void toAllLowerLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
filatov's avatar
filatov committed
29
30
31
32
    inline void receiveToAllLayers(const OCTETSTRING& data, const Params& info) { toAllLayers(upperLayers, data, info); }
    inline void sendToAllLayers(const OCTETSTRING& data, const Params& info)  { toAllLayers(lowerLayers, data, info); }
};

filatov's avatar
filatov committed
33

filatov's avatar
filatov committed
34
35
template <typename TPort> class TLayer : public Layer {
  typedef std::vector<TPort*> TPortList;
36
  typedef typename std::vector<TPort*>::iterator TPortListIterator;
filatov's avatar
filatov committed
37

filatov's avatar
filatov committed
38
  TPortList upperPorts;
39
  
filatov's avatar
filatov committed
40
41
42
43
  public:
    TLayer(){}
    void addUpperPort(TPort*);
    void removeUpperPort(TPort*);
44

filatov's avatar
filatov committed
45
46
  protected:
    template <typename TMessage> void toAllUpperPorts(const TMessage& m, const Params& param) {
47
      for(TPortListIterator it=upperPorts.begin(); it<upperPorts.end(); ++it){
filatov's avatar
filatov committed
48
49
50
51
52
        (*it)->receiveMsg(m, param);
      }
    }
};

filatov's avatar
filatov committed
53

filatov's avatar
filatov committed
54
55
56
class LayerFactory {
  public:
   LayerFactory(){}
57
   virtual Layer * createLayer(const std::string & type, const std::string & param) = 0;
filatov's avatar
filatov committed
58
59
};

filatov's avatar
filatov committed
60
61
62
63
64
65
66
class LayerStackBuilder {
   typedef std::map<std::string, LayerFactory*> LayerFactoryMap;

   static LayerStackBuilder * _instance;
   std::map<std::string, LayerFactory*> _fs;
  private:
   LayerStackBuilder(); // can not be created manually
filatov's avatar
filatov committed
67
  public:
filatov's avatar
filatov committed
68
69
   static LayerStackBuilder * GetInstance();
   static void RegisterLayerFactory(const std::string & type, LayerFactory * f);
filatov's avatar
filatov committed
70

filatov's avatar
filatov committed
71
  public:
filatov's avatar
filatov committed
72
73
74
75
   void registerLayerFactory(const std::string & type, LayerFactory * f);
   Layer* createLayerStack(const char*);
};

filatov's avatar
filatov committed
76
#endif