1030 { |
1030 { |
1031 typedef BaseWindow* (*CreateFn)(WindowNumber); |
1031 typedef BaseWindow* (*CreateFn)(WindowNumber); |
1032 |
1032 |
1033 typedef std::map<WindowClass, WindowFactory*> Factories; |
1033 typedef std::map<WindowClass, WindowFactory*> Factories; |
1034 |
1034 |
1035 static Factories s_factories; |
1035 static Factories& GetFactories() |
|
1036 { |
|
1037 static Factories s_factories; |
|
1038 return s_factories; |
|
1039 } |
1036 |
1040 |
1037 WindowClass m_cls; |
1041 WindowClass m_cls; |
1038 CreateFn m_creator; |
1042 CreateFn m_creator; |
1039 |
1043 |
1040 WindowFactory(WindowClass cls, CreateFn creator) |
1044 WindowFactory(WindowClass cls, CreateFn creator) |
1041 : m_cls(cls) |
1045 : m_cls(cls) |
1042 , m_creator(creator) |
1046 , m_creator(creator) |
1043 { |
1047 { |
1044 std::pair<Factories::iterator, bool> P = s_factories.insert(Factories::value_type(m_cls, this)); |
1048 std::pair<Factories::iterator, bool> P = GetFactories().insert(Factories::value_type(m_cls, this)); |
1045 assert(P.second); |
1049 assert(P.second); |
1046 } |
1050 } |
1047 |
1051 |
1048 ~WindowFactory() |
1052 ~WindowFactory() |
1049 { |
1053 { |
1050 s_factories.erase(m_cls); |
1054 GetFactories().erase(m_cls); |
1051 } |
1055 } |
1052 |
1056 |
1053 static BaseWindow* NewWindow(WindowClass cls, WindowNumber num) |
1057 static BaseWindow* NewWindow(WindowClass cls, WindowNumber num) |
1054 { |
1058 { |
1055 Factories::iterator it = s_factories.find(cls); |
1059 Factories::iterator it = GetFactories().find(cls); |
1056 if (it == s_factories.end()) return NULL; |
1060 if (it == GetFactories().end()) return NULL; |
1057 WindowFactory *f = (*it).second; |
1061 WindowFactory *f = (*it).second; |
1058 BaseWindow *w = f->m_creator(num); |
1062 BaseWindow *w = f->m_creator(num); |
1059 return w; |
1063 return w; |
1060 } |
1064 } |
1061 |
1065 |