00001 /*********************************************************************** 00002 * Software License Agreement (BSD License) 00003 * 00004 * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. 00005 * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. 00006 * 00007 * THE BSD LICENSE 00008 * 00009 * Redistribution and use in source and binary forms, with or without 00010 * modification, are permitted provided that the following conditions 00011 * are met: 00012 * 00013 * 1. Redistributions of source code must retain the above copyright 00014 * notice, this list of conditions and the following disclaimer. 00015 * 2. Redistributions in binary form must reproduce the above copyright 00016 * notice, this list of conditions and the following disclaimer in the 00017 * documentation and/or other materials provided with the distribution. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 00020 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00021 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 00022 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 00023 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 00024 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00025 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00026 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 00028 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00029 *************************************************************************/ 00030 00031 #ifndef _OPENCV_OBJECT_FACTORY_H_ 00032 #define _OPENCV_OBJECT_FACTORY_H_ 00033 00034 #include "opencv2/core/types_c.h" 00035 #include <map> 00036 00037 namespace cvflann 00038 { 00039 00040 template<typename BaseClass, typename DerivedClass> 00041 BaseClass* createObject() 00042 { 00043 return new DerivedClass(); 00044 } 00045 00046 template<typename BaseClass, typename UniqueIdType> 00047 class ObjectFactory 00048 { 00049 typedef BaseClass* (*CreateObjectFunc)(); 00050 std::map<UniqueIdType, CreateObjectFunc> object_registry; 00051 00052 // singleton class, private constructor 00053 //ObjectFactory() {}; 00054 00055 public: 00056 typedef typename std::map<UniqueIdType, CreateObjectFunc>::iterator Iterator; 00057 00058 00059 template<typename DerivedClass> 00060 bool register_(UniqueIdType id) 00061 { 00062 if (object_registry.find(id) != object_registry.end()) 00063 return false; 00064 00065 object_registry[id] = &createObject<BaseClass, DerivedClass>; 00066 return true; 00067 } 00068 00069 bool unregister(UniqueIdType id) 00070 { 00071 return (object_registry.erase(id) == 1); 00072 } 00073 00074 BaseClass* create(UniqueIdType id) 00075 { 00076 Iterator iter = object_registry.find(id); 00077 00078 if (iter == object_registry.end()) 00079 return NULL; 00080 00081 return ((*iter).second)(); 00082 } 00083 00084 /*static ObjectFactory<BaseClass,UniqueIdType>& instance() 00085 { 00086 static ObjectFactory<BaseClass,UniqueIdType> the_factory; 00087 return the_factory; 00088 }*/ 00089 00090 }; 00091 00092 } // namespace cvflann 00093 00094 #endif /* OBJECT_FACTORY_H_ */