slots.hxx

00001 // slots.hxx: 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_DESIGN_PATTERN_SLOTS_HXX
00018 # define VCSN_DESIGN_PATTERN_SLOTS_HXX
00019 
00020 # include <vaucanson/design_pattern/slots.hh>
00021 # include <cstdlib>
00022 # include <vaucanson/misc/unique.hh>
00023 # include <vaucanson/misc/contract.hh>
00024 
00025 namespace vcsn {
00026 
00027   /*------------------------------------------.
00028   | SetSlotAttribute constructors and methods |
00029   `------------------------------------------*/
00030 
00031   template<typename S, bool dynamic /* default: false */>
00032   SetSlotAttribute<S, dynamic>::SetSlotAttribute()
00033   {}
00034 
00035   template<typename S, bool dynamic /* default: false */>
00036   SetSlotAttribute<S, dynamic>::SetSlotAttribute(const SetSlotAttribute&)
00037   {}
00038 
00039   template<typename S, bool dynamic /* default: false */>
00040   SetSlotAttribute<S, dynamic>::SetSlotAttribute(const S&)
00041   {}
00042 
00043   template<typename S, bool dynamic /* default: false */>
00044   const S& SetSlotAttribute<S, dynamic>::_structure_get() const
00045   {
00046     return *static_cast<const S*>(NULL);
00047   }
00048 
00049   template<typename S, bool dynamic /* default: false */>
00050   void SetSlotAttribute<S, dynamic>::_structure_assign(const SetSlotAttribute&)
00051   {}
00052 
00053   template<typename S, bool dynamic /* default: false */>
00054   void SetSlotAttribute<S, dynamic>::_structure_attach(const S& )
00055   {}
00056 
00057   template<typename S, bool dynamic /* default: false */>
00058   bool SetSlotAttribute<S, dynamic>::_structure_bound() const
00059   {
00060     return true;
00061   }
00062 
00063   /*--------------------------------------------------.
00064   | Specialization when structural element is dynamic |
00065   `--------------------------------------------------*/
00066 
00067   template <class S>
00068   SetSlotAttribute<S, true>::SetSlotAttribute()
00069     : s_(NULL)
00070   {}
00071 
00072   template <class S>
00073   SetSlotAttribute<S, true>::SetSlotAttribute(const SetSlotAttribute& other)
00074     : s_(other.s_)
00075   {}
00076 
00077   template <class S>
00078   SetSlotAttribute<S, true>::SetSlotAttribute(const S& other)
00079     : s_(& other ? & misc::unique::get(other) : NULL)
00080   {}
00081 
00082   template <class S>
00083   const S& SetSlotAttribute<S, true>::_structure_get() const
00084   {
00085     return *s_;
00086   }
00087 
00088   template <class S>
00089   void SetSlotAttribute<S, true>::_structure_assign(const SetSlotAttribute& other)
00090   {
00091     s_ = other.s_;
00092   }
00093 
00094   template <class S>
00095   void SetSlotAttribute<S, true>::_structure_attach(const S& s)
00096   {
00097     precondition(&s != NULL);
00098     s_ = & misc::unique::get(s);
00099   }
00100 
00101   template <class S>
00102   bool SetSlotAttribute<S, true>::_structure_bound() const
00103   {
00104     return s_;
00105   }
00106 
00107   /*---------------------.
00108   | SetSlot constructors |
00109   `---------------------*/
00110 
00111 
00112   template <class S, class Tag>
00113   SetSlot<S,Tag>::SetSlot()
00114     : SetSlotAttribute<S, dynamic_traits<S>::ret>()
00115   {}
00116 
00117   template <class S, class Tag>
00118   SetSlot<S,Tag>::SetSlot(const SetSlot& other)
00119     : SetSlotAttribute<S, dynamic_traits<S>::ret>(other)
00120   {}
00121 
00122   template <class S, class Tag>
00123   SetSlot<S,Tag>::SetSlot(const S& other)
00124     : SetSlotAttribute<S, dynamic_traits<S>::ret>(other)
00125   {}
00126 
00127 
00128 } // vcsn
00129 
00130 #endif // ! VCSN_DESIGN_PATTERN_SLOTS_HXX

Generated on Wed Jun 13 17:00:29 2007 for Vaucanson by  doxygen 1.5.1