00001 /*!@file Channels/ChannelFacet.C Allow user-configurable "facets" to be associated with arbitrary classes */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005 // 00005 // by the University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: Rob Peters <rjpeters at usc dot edu> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Channels/ChannelFacet.C $ 00035 // $Id: ChannelFacet.C 9748 2008-05-11 19:21:54Z rjpeters $ 00036 // 00037 00038 #ifndef CHANNELS_CHANNELFACET_C_DEFINED 00039 #define CHANNELS_CHANNELFACET_C_DEFINED 00040 00041 #include "Channels/ChannelFacet.H" 00042 00043 #include "Component/ParamMap.H" 00044 #include "rutz/demangle.h" 00045 00046 #include <map> 00047 #include <string> 00048 00049 typedef std::map<std::string, rutz::shared_ptr<ChannelFacet> > map_type; 00050 00051 struct ChannelFacetMap::Impl 00052 { 00053 map_type facets; 00054 }; 00055 00056 // ###################################################################### 00057 ChannelFacet::ChannelFacet() {} 00058 00059 // ###################################################################### 00060 ChannelFacet::~ChannelFacet() {} 00061 00062 // ###################################################################### 00063 ChannelFacetMap::ChannelFacetMap() 00064 : 00065 rep(new Impl) 00066 {} 00067 00068 // ###################################################################### 00069 ChannelFacetMap::~ChannelFacetMap() 00070 { 00071 delete rep; 00072 } 00073 00074 // ###################################################################### 00075 void ChannelFacetMap::writeFacetsTo(ParamMap& pmap) const 00076 { 00077 for (map_type::const_iterator 00078 itr = rep->facets.begin(), stop = rep->facets.end(); 00079 itr != stop; ++itr) 00080 { 00081 rutz::shared_ptr<ParamMap> submap(new ParamMap); 00082 (*itr).second->writeTo(*submap); 00083 pmap.putSubpmap((*itr).first, submap); 00084 } 00085 } 00086 00087 // ###################################################################### 00088 void ChannelFacetMap::readFacetsFrom(const ParamMap& pmap) 00089 { 00090 for (map_type::const_iterator 00091 itr = rep->facets.begin(), stop = rep->facets.end(); 00092 itr != stop; ++itr) 00093 { 00094 const std::string name = (*itr).first; 00095 if (!pmap.hasParam(name)) 00096 LFATAL("no such facet in ParamMap: '%s'", name.c_str()); 00097 00098 rutz::shared_ptr<ParamMap> submap = pmap.getSubpmap(name); 00099 (*itr).second->readFrom(*submap); 00100 } 00101 } 00102 00103 // ###################################################################### 00104 unsigned int ChannelFacetMap::numFacets() const 00105 { 00106 return rep->facets.size(); 00107 } 00108 00109 // ###################################################################### 00110 rutz::shared_ptr<ChannelFacet> 00111 ChannelFacetMap::getBaseFacet(const std::type_info& tp) const 00112 { 00113 map_type::const_iterator itr = 00114 rep->facets.find(rutz::demangled_name(tp)); 00115 if (itr == rep->facets.end()) 00116 return rutz::shared_ptr<ChannelFacet>(); 00117 // else... 00118 return (*itr).second; 00119 } 00120 00121 // ###################################################################### 00122 void ChannelFacetMap::setBaseFacet(const std::type_info& tp, 00123 rutz::shared_ptr<ChannelFacet> f) 00124 { 00125 rep->facets.insert(map_type::value_type(rutz::demangled_name(tp), f)); 00126 } 00127 00128 00129 // ###################################################################### 00130 /* So things look consistent in everyone's emacs... */ 00131 /* Local Variables: */ 00132 /* mode: c++ */ 00133 /* indent-tabs-mode: nil */ 00134 /* End: */ 00135 00136 #endif // CHANNELS_CHANNELFACET_C_DEFINED