wibble 1.1
singleton.h
Go to the documentation of this file.
1// -*- C++ -*-
2#ifndef WIBBLE_SINGLETON_H
3#define WIBBLE_SINGLETON_H
4
5/*
6 * Degenerated container to hold a single value
7 *
8 * Copyright (C) 2006 Enrico Zini <enrico@debian.org>
9 * (C) 2013 Petr Rockai <me@mornfall.net>
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
26#include <cstddef>
27#include <iterator>
28
29namespace wibble {
30
31template<typename T>
33{
34protected:
36
37public:
38 typedef T value_type;
39
40 class const_iterator : public std::iterator<std::forward_iterator_tag, const T, void, const T*, const T&>
41 {
42 const T* value;
43
44 protected:
45 const_iterator(const T* value) : value(value) {}
46
47 public:
48 const_iterator() : value(0) {}
49
50 const T& operator*() const { return *value; }
51 const T* operator->() const { return value; }
52 const_iterator& operator++() { value = 0; return *this; }
53 bool operator==(const const_iterator& iter) const { return value == iter.value; }
54 bool operator!=(const const_iterator& iter) const { return value != iter.value; }
55
56 friend class Singleton<T>;
57 };
58
59 class iterator : public std::iterator<std::forward_iterator_tag, T, void, T*, T&>
60 {
61 T* value;
62
63 protected:
64 iterator(T* value) : value(value) {}
65
66 public:
67 iterator() : value(0) {}
68
69 T& operator*() { return *value; }
70 T* operator->() { return value; }
71 iterator& operator++() { value = 0; return *this; }
72 bool operator==(const iterator& iter) const { return value == iter.value; }
73 bool operator!=(const iterator& iter) const { return value != iter.value; }
74
75 friend class Singleton<T>;
76 };
77
78 explicit Singleton(const T& value) : value(value) {}
80
81 bool empty() const { return false; }
82 size_t size() const { return 1; }
83
84 iterator begin() { return iterator(&value); }
85 iterator end() { return iterator(); }
87 const_iterator end() const { return const_iterator(); }
88
89 iterator insert( iterator /* position */, const value_type &v )
90 {
91 value = v;
92 return begin();
93 }
94
96 value = v;
97 return begin();
98 }
99};
100
101template<typename T>
102Singleton<T> singleton(const T& value)
103{
104 return Singleton<T>(value);
105}
106
107}
108
109// vim:set ts=4 sw=4:
110#endif
Definition singleton.h:41
const T & operator*() const
Definition singleton.h:50
const T * operator->() const
Definition singleton.h:51
const_iterator(const T *value)
Definition singleton.h:45
const_iterator & operator++()
Definition singleton.h:52
const_iterator()
Definition singleton.h:48
bool operator==(const const_iterator &iter) const
Definition singleton.h:53
bool operator!=(const const_iterator &iter) const
Definition singleton.h:54
Definition singleton.h:60
iterator & operator++()
Definition singleton.h:71
iterator(T *value)
Definition singleton.h:64
iterator()
Definition singleton.h:67
bool operator==(const iterator &iter) const
Definition singleton.h:72
T & operator*()
Definition singleton.h:69
bool operator!=(const iterator &iter) const
Definition singleton.h:73
T * operator->()
Definition singleton.h:70
Definition singleton.h:33
size_t size() const
Definition singleton.h:82
const_iterator end() const
Definition singleton.h:87
T value_type
Definition singleton.h:38
Singleton(const T &value)
Definition singleton.h:78
iterator insert(const value_type &v)
Definition singleton.h:95
iterator insert(iterator, const value_type &v)
Definition singleton.h:89
iterator begin()
Definition singleton.h:84
iterator end()
Definition singleton.h:85
bool empty() const
Definition singleton.h:81
T value
Definition singleton.h:35
Singleton()
Definition singleton.h:79
const_iterator begin() const
Definition singleton.h:86
Definition amorph.h:17
Singleton< T > singleton(const T &value)
Definition singleton.h:102
Definition amorph.h:30