Orocos Real-Time Toolkit  2.5.0
NameServer.hpp
00001 /***************************************************************************
00002   tag: Peter Soetens  Thu Oct 10 16:16:57 CEST 2002  NameServer.hpp
00003 
00004                         NameServer.hpp -  description
00005                            -------------------
00006     begin                : Thu October 10 2002
00007     copyright            : (C) 2002 Peter Soetens
00008     email                : peter.soetens@mech.kuleuven.ac.be
00009 
00010  ***************************************************************************
00011  *   This library is free software; you can redistribute it and/or         *
00012  *   modify it under the terms of the GNU General Public                   *
00013  *   License as published by the Free Software Foundation;                 *
00014  *   version 2 of the License.                                             *
00015  *                                                                         *
00016  *   As a special exception, you may use this file as part of a free       *
00017  *   software library without restriction.  Specifically, if other files   *
00018  *   instantiate templates or use macros or inline functions from this     *
00019  *   file, or you compile this file and link it with other files to        *
00020  *   produce an executable, this file does not by itself cause the         *
00021  *   resulting executable to be covered by the GNU General Public          *
00022  *   License.  This exception does not however invalidate any other        *
00023  *   reasons why the executable file might be covered by the GNU General   *
00024  *   Public License.                                                       *
00025  *                                                                         *
00026  *   This library is distributed in the hope that it will be useful,       *
00027  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00028  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
00029  *   Lesser General Public License for more details.                       *
00030  *                                                                         *
00031  *   You should have received a copy of the GNU General Public             *
00032  *   License along with this library; if not, write to the Free Software   *
00033  *   Foundation, Inc., 59 Temple Place,                                    *
00034  *   Suite 330, Boston, MA  02111-1307  USA                                *
00035  *                                                                         *
00036  ***************************************************************************/
00037 
00038 #ifndef ORO_NAMESERVER_HPP
00039 #define ORO_NAMESERVER_HPP
00040 
00041 #include <iterator>
00042 #include <string>
00043 #include <map>
00044 // #include "rtt-config.h"
00045 // #ifdef OROPKG_CORELIB_REPORTING
00046 // #include "../../Logger.hpp"
00047 // #endif
00048 
00049 namespace RTT
00050 { namespace dev {
00051 
00070     template < class _ValueType >
00071     class NameServer
00072     {
00073     public:
00074         typedef _ValueType ValueType;
00075         typedef std::string NameType;
00076         typedef std::map<NameType, ValueType> Rep;
00080         typedef typename Rep::iterator iterator;
00084         typedef typename Rep::const_iterator const_iterator;
00085 
00089         NameServer() : objects()
00090         {}
00091 
00095         ~NameServer()
00096         {}
00097 
00105         bool isNameRegistered( const NameType& s ) const
00106         {
00107             return ( objects.find( s ) != objects.end() );
00108         }
00109 
00117         bool isObjectRegistered( const ValueType o ) const
00118         {
00119             for ( const_iterator i = objects.begin(); i != objects.end(); ++i )
00120                 {
00121                     if ( ( *i ).second == o )
00122                         return true;
00123                 }
00124 
00125             return false;
00126         }
00127 
00136         ValueType getObject( const NameType& s ) const
00137         {
00138             const_iterator itc = objects.find( s );
00139             if ( itc == objects.end() )
00140                 return ValueType();
00141             return( *itc ).second;
00142         }
00143 
00152         const NameType&
00153         getName( const ValueType s ) const
00154         {
00155             for ( const_iterator i = objects.begin(); i != objects.end(); ++i )
00156                 {
00157                     if ( ( *i ).second == s )
00158                         return ( *i ).first;
00159                 }
00160 
00161             return NoName;
00162         }
00163 
00172         bool registerObject( const ValueType obj, const NameType& name )
00173         {
00174             if ( isNameRegistered( name ) )
00175                 return false;
00176 // #ifdef OROPKG_CORELIB_REPORTING
00177 //             Logger::log() << Logger::Debug << "NameServer : Adding " << name << Logger::endl;
00178 // #endif
00179             objects.insert(std::make_pair(name,obj));
00180             return true;
00181         }
00182 
00190         void unregisterObject( const ValueType obj )
00191         {
00192             iterator i(objects.begin());
00193 
00197             for(;;)
00198                 {
00199                     for ( i = objects.begin();
00200                           i != objects.end();
00201                           ++i )
00202                         {
00203                             if ( ( *i ).second == obj )
00204                                 break;
00205                         }
00206 
00207                     if ( i == objects.end() ) return;
00208 // #ifdef OROPKG_CORELIB_REPORTING
00209 //                         Logger::log() << Logger::Debug << "NameServer : Removing " << (*i).first << Logger::endl;
00210 // #endif
00211                        objects.erase( i );
00212                 }
00213         }
00214 
00221         void unregisterName( const NameType& name )
00222         {
00223             iterator i( objects.find( name ) );
00224 
00225             if ( i != objects.end() ) {
00226                 objects.erase( i );
00227 // #ifdef OROPKG_CORELIB_REPORTING
00228 //                 Logger::log() << Logger::Debug << "NameServer : Removing " << name << Logger::endl;
00229 // #endif
00230                     }
00231         }
00232 
00238 #if __GNUC__ == 2
00239         class value_iterator : public bidirectional_iterator<ValueType, int>
00240 #else
00241         class value_iterator : public std::iterator<std::input_iterator_tag, ValueType>
00242 #endif
00243         {
00244         protected:
00245             typename NameServer<_ValueType>::iterator i;
00246 
00247         public:
00248             value_iterator( iterator _i ) : i( _i )
00249             {}
00250 
00251             ValueType operator*()
00252             {
00253                 return ( ( *i ).second );
00254             }
00255 
00256             value_iterator& operator++()
00257             {
00258                 ++i;
00259                 return *this;
00260             }
00261 
00262             value_iterator& operator--()
00263             {
00264                 --i;
00265                 return *this;
00266             }
00267 
00268             value_iterator operator++( int )
00269             {
00270                 value_iterator ret;
00271                 operator++();
00272                 return ret;
00273             }
00274 
00275             value_iterator operator--( int )
00276             {
00277                 value_iterator ret;
00278                 operator--();
00279                 return ret;
00280             }
00281 
00282             bool operator==( value_iterator other )
00283             {
00284                 return ( i == other.i );
00285             }
00286 
00287             bool operator!=( value_iterator other )
00288             {
00289                 return ( i != other.i );
00290             }
00291 
00292             int operator- ( value_iterator other )
00293             {
00294                 return ( i -other.i );
00295             }
00296         };
00297 
00303 #if __GNUC__ == 2
00304         class name_iterator : public bidirectional_iterator<NameType, int>
00305 #else
00306         class name_iterator : public std::iterator< std::input_iterator_tag , NameType>
00307 #endif
00308         {
00309 
00310         protected:
00311             typename NameServer<_ValueType>::iterator i;
00312 
00313         public:
00314 
00315             name_iterator( iterator _i ) : i( _i )
00316             {}
00317 
00318             NameType operator*()
00319             {
00320                 return ( ( *i ).first );
00321             }
00322 
00323             name_iterator operator++( int )
00324             {
00325                 name_iterator ret( i );
00326                 operator++();
00327                 return ret;
00328             }
00329 
00330             name_iterator& operator++()
00331             {
00332                 ++i;
00333                 return *this;
00334             }
00335 
00336             name_iterator& operator--()
00337             {
00338                 --i;
00339                 return *this;
00340             }
00341 
00342             name_iterator operator--( int )
00343             {
00344                 name_iterator ret( i );
00345                 operator--();
00346                 return ret;
00347             }
00348 
00349             bool operator==( name_iterator other )
00350             {
00351                 return ( i == other.i );
00352             }
00353 
00354             bool operator!=( name_iterator other )
00355             {
00356                 return ( i != other.i );
00357             }
00358 
00359             int operator- ( name_iterator other )
00360             {
00361                 return ( i -other.i );
00362             }
00363         };
00364 
00368         name_iterator getNameBegin() { return name_iterator( objects.begin() ); }
00369 
00373         name_iterator getNameEnd() { return name_iterator( objects.end() ); }
00374 
00378         value_iterator getValueBegin() { return value_iterator( objects.begin() ); }
00379 
00383         value_iterator getValueEnd() { return value_iterator( objects.end() ); }
00384 
00385     private:
00386         Rep objects;
00387         static NameType NoName;
00388     };
00389 
00390     template<class T>
00391     std::string NameServer<T>::NoName;
00392 
00393 }}
00394 
00395 #endif // NAMESERVER_HPP