Vaucanson  1.4.1
smart_label.hxx
1 // smart_label.hxx: this file is part of the Vaucanson project.
2 //
3 // Vaucanson, a generic library for finite state machines.
4 //
5 // Copyright (C) 2007 The Vaucanson Group.
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 //
12 // The complete GNU General Public Licence Notice can be found as the
13 // `COPYING' file in the root directory.
14 //
15 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
16 //
17 
18 #ifndef VCSN_AUTOMATA_CONCEPT_SMART_LABEL_HXX_
19 # define VCSN_AUTOMATA_CONCEPT_SMART_LABEL_HXX_
20 
21 namespace vcsn
22 {
23 
24  template <typename T>
25  struct SmartLabel_ref_dec
26  {
27  SmartLabel_ref_dec (const SmartLabel<T>&)
28  { }
29 
30  int operator() (SmartLabel<T>& sl)
31  {
32  return sl.ref_dec ();
33  }
34  };
35 
36  template <typename T>
37  struct SmartLabel_ref_inc
38  {
39  SmartLabel_ref_inc (const SmartLabel<T>&)
40  { }
41 
42  int operator() (SmartLabel<T>& sl)
43  {
44  return sl.ref_inc ();
45  }
46  };
47 
48  /*-----------`
49  | SmartLabel |
50  \-----------*/
51 
52  template <typename T>
53  SmartLabel<T>::SmartLabel(const boost::shared_ptr<T>& p)
54  : value_(p),
55  ref_(1)
56  { }
57 
58  template <typename T>
59  const T&
60  SmartLabel<T>::value() const
61  {
62  return *value_;
63  }
64 
65  template <typename T>
66  int
67  SmartLabel<T>::ref() const
68  {
69  return ref_;
70  }
71 
72  template <typename T>
73  int
74  SmartLabel<T>::ref_dec()
75  {
76  return --ref_;
77  }
78 
79  template <typename T>
80  int
81  SmartLabel<T>::ref_inc()
82  {
83  return ++ref_;
84  }
85 
86  template <typename T>
87  SmartLabel<T>::operator const T&()
88  {
89  return value();
90  }
91 
92 
93  /*---------------------`
94  | SmartLabelContainer |
95  \--------------------*/
96 
97  template <typename T>
98  typename SmartLabelContainer<T>::hlabel_t
99  SmartLabelContainer<T>::insert (const T& l)
100  {
101  typename label_container_t::iterator i = data_.find (l);
102 
103  if (i != data_.end ())
104  {
105  data_.modify (i, SmartLabel_ref_inc<T> (*i));
106  return hlabel_t (&*i);
107  }
108  else
109  {
110  ::boost::shared_ptr<T> p(new T(l));
111  return hlabel_t (&*data_.insert (SmartLabel<T> (p)).first);
112  }
113  }
114 
115  template <typename T>
116  void
117  SmartLabelContainer<T>::erase (const hlabel_t& h)
118  {
119  if (h.value()->ref () > 1)
120  {
121  typename label_container_t::iterator i = data_.find (h.value()->value());
122  data_.modify (i, SmartLabel_ref_dec<T> (*i));
123  }
124  else
125  data_.erase (h.value()->value());
126  }
127 
128  template <typename T>
129  typename SmartLabelContainer<T>::hlabel_t
130  SmartLabelContainer<T>::update (const hlabel_t& h, const T& l)
131  {
132  erase (h);
133  return insert (l);
134  }
135 
136  template <typename T>
137  const T&
138  SmartLabelContainer<T>::get_label (const hlabel_t& h) const
139  {
140  return h.value()->value();
141  }
142 
143  template <typename T>
144  typename SmartLabelContainer<T>::hlabel_t
145  SmartLabelContainer<T>::get_hlabel (const T& l) const
146  {
147  return hlabel_t (&*data_.find (l));
148  }
149 
150 } // End of namespace vcsn
151 
152 #endif // ! VCSN_AUTOMATA_CONCEPT_SMART_LABEL_HXX_ //