ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/utils/GenericFactory.hpp
Revision: 1592
Committed: Mon Oct 18 17:07:27 2004 UTC (19 years, 8 months ago) by tim
File size: 3349 byte(s)
Log Message:
fix some bugs in Quaternion class

File Contents

# User Rev Content
1 tim 1587 /*
2     * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project
3     *
4     * Contact: oopse@oopse.org
5     *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU Lesser General Public License
8     * as published by the Free Software Foundation; either version 2.1
9     * of the License, or (at your option) any later version.
10     * All we ask is that proper credit is given for our work, which includes
11     * - but is not limited to - adding the above copyright notice to the beginning
12     * of your source code files, and to any copyright notice that you may distribute
13     * with programs based on this work.
14     *
15     * This program is distributed in the hope that it will be useful,
16     * but WITHOUT ANY WARRANTY; without even the implied warranty of
17     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18     * GNU Lesser General Public License for more details.
19     *
20     * You should have received a copy of the GNU Lesser General Public License
21     * along with this program; if not, write to the Free Software
22     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23     *
24     */
25    
26     /**
27     * @file Vector3.hpp
28     * @author Teng Lin
29     * @date 09/14/2004
30     * @version 1.0
31     */
32     #ifndef UTIL_GENERICFACTORY_HPP
33     #define UTIL_GENERICFACTORY_HPP
34     #include <map>
35     #include <string>
36 tim 1592 namespace oopse {
37     template<class Product, typename ProductIdentType = std::string, typename Creator = Product* (*)() >
38 tim 1587 class GenericFactory{
39     public:
40    
41 tim 1592 typedef std::map<ProductIdentType, Creator*> CreatorMapType;
42     typedef GenericFactory<Product, ProductIdentType, Creator> SelfType;
43     static SelfType* getInstance() {
44     if (instance_ == NULL) {
45     instance_ = new GenericFactory<Product, ProductIdentType, Creator>();
46     }
47 tim 1587
48 tim 1592 return instance_;
49     }
50    
51     //bool register( const ProductIdentType& id, Creator creator) {
52 tim 1587
53 tim 1592 //insert method in std::map will return a pair<iterator, bool>. the second
54     //element of this pair indicates whether the result of the operation
55     //return creatorMap_.insert(CreatorMapType::value_type(id, creator)).second;
56     //}
57 tim 1587
58 tim 1592 bool unregister(const ProductIdentType& id) {
59    
60     return creatorMap_->erase(id) == 1;
61    
62     }
63 tim 1587
64 tim 1592 bool hasCreator( const ProductIdentType& id ) {
65     CreatorMapType::iterator i;
66 tim 1587
67 tim 1592 i = creatorMap_.find(id);
68 tim 1587
69 tim 1592 if (i != creatorMap_.end()) {
70     return true;
71     } else {
72     return false;
73     }
74     }
75    
76     //const std::string toString() {
77    
78 tim 1587
79 tim 1592 //}
80    
81     Product* createProduct( const ProductIdentType& id ) {
82     CreatorMapType::iterator i;
83    
84     i = creatorMap_.find(id);
85    
86     if (i != creatorMap_.end()) {
87     //call the function to create the product
88     return (i->second)();
89     } else {
90     return NULL;
91     }
92     }
93    
94 tim 1587 private:
95     GenericFactory(){}
96 tim 1592 static SelfType* instance_;
97     CreatorMapType creatorMap_;
98 tim 1587 };
99    
100    
101 tim 1592 #define REGISTER_CREATOR(factory, product, id) \
102     product * create##product() {\
103     return new product(); \
104     }
105    
106     }//namespace oopse
107     #endif //UTIL_GENERICFACTORY_HPP
108