include/opencv2/flann/object_factory.h
Go to the documentation of this file.
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_ */