- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

# unique.hh

Go to the documentation of this file.

    00001 // unique.hh: this file is part of the Vaucanson project.
    00002 //
    00003 // Vaucanson, a generic library for finite state machines.
    00004 //
    00005 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 The Vaucanson Group.
    00006 //
    00007 // This program is free software; you can redistribute it and/or
    00008 // modify it under the terms of the GNU General Public License
    00009 // as published by the Free Software Foundation; either version 2
    00010 // of the License, or (at your option) any later version.
    00011 //
    00012 // The complete GNU General Public Licence Notice can be found as the
    00013 // `COPYING' file in the root directory.
    00014 //
    00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
    00016 //
    00017 #ifndef VCSN_MISC_UNIQUE_HH
    00018 # define VCSN_MISC_UNIQUE_HH
    00019
    00025 # include <list>
    00026 # include <algorithm>
    00027 # include <typeinfo>
    00028 # include <map>
    00029
    00030 namespace vcsn
    00031 {
    00032   namespace misc
    00033   {
    00035     namespace unique
    00036     {
    00038       template <class T>
    00039       struct UniqueListBase
    00040       {
    00041           virtual ~UniqueListBase ();
    00042       };
    00043
    00044       typedef UniqueListBase<int> uniquelist_base;
    00045
    00053       template <typename T>
    00054       struct uniquelist : public std::list<T>, public uniquelist_base
    00055       {
    00056           ~uniquelist ();
    00057       };
    00058
    00071       template <class T>
    00072       struct UniqueMap
    00073       {
    00076           template <class U>
    00077           struct TiSlot
    00078           {
    00079               TiSlot (const std::type_info& );
    00080               const std::type_info &id;
    00081               bool operator== (const TiSlot& other) const;
    00082               bool operator< (const TiSlot& other) const;
    00083           };
    00084
    00085           typedef TiSlot<int> ti_slot;
    00086
    00088           typedef std::map<ti_slot, uniquelist_base*> map_t;
    00089
    00091           static map_t& instance ();
    00092         protected:
    00093           map_t map_;
    00097           UniqueMap ();
    00104           ~UniqueMap ();
    00105       };
    00106
    00107       typedef UniqueMap<int> unique_map;
    00108
    00109       struct unifiable
    00110       {
    00111           inline unifiable ();
    00112           inline unifiable (const unifiable&);
    00113         private:
    00114           template <typename T>
    00115           friend const T& get (const T&);
    00116           bool unique_;
    00117       };
    00118
    00127       template <typename T>
    00128       const T& get (const T&);
    00129
    00131       template <typename T>
    00132       const T* get (const T*);
    00133
    00135     }
    00136
    00137   } // misc
    00138 } // vcsn
    00139
    00140 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
    00141 #  include <vaucanson/misc/unique.hxx>
    00142 # endif // INTERFACE_ONLY
    00143
    00144 #endif // ! VCSN_MISC_UNIQUE_HH