Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Enumerator.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Enumerator.h (C) 2000-2022 */
9/* */
10/* Enumérateurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ENUMERATOR_H
13#define ARCANE_ENUMERATOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ObjectImpl.h"
18#include "arcane/utils/AutoRef.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28/*!
29 * \internal
30 * \brief Interface d'un énumérateur.
31 *
32 * Cette classe sert de classe de base à toutes les implémentations
33 * d'itérateurs.
34 * Cette classe ne doit pas être utilisée directement: pour effectuer une
35 * énumération, il faut utiliser la classe Enumerator ou une de ces
36 * classes dérivée.
37 *
38 * \sa Enumerator
39 */
40class ARCANE_UTILS_EXPORT EnumeratorImplBase
41: public ObjectImpl
42{
43 public:
44
45 /*! \brief Remet à zéro l'énumérateur.
46 *
47 * Positionne l'énumérateur juste avant le premier élément de la collection.
48 * Il faut faire un moveNext() pour le rendre valide.
49 */
50 virtual void reset() = 0;
51 /*! \brief Avance l'énumérateur sur l'élément suivant de la collection.
52 *
53 * \retval true si l'énumérateur n'a pas dépassé le dernier élément. Dans
54 * ce cas l'appel à current() est valide.
55 * \retval false si l'énumérateur a dépassé le derniere élément. Dans ce
56 * cas tout appel suivant à cette méthode retourne \a false et l'appel
57 * à current() n'est pas valide.
58 */
59 virtual bool moveNext() = 0;
60 //! Objet courant de l'énumérateur.
61 virtual void* current() = 0;
62 //! Objet courant de l'énumérateur.
63 virtual const void* current() const = 0;
64
65 private:
66};
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70/*!
71 * \ingroup Collection
72 * \brief Enumérateur générique.
73 *
74 * Cette classe permet d'itérer de manière générique sur une collection,
75 * sans connaître le type des éléments de la collection. Pour une itération
76 * utilisant un typage fort, il faut utiliser la classe template EnumeratorT.
77 *
78 * Exemple d'utilisation d'un énumérateur:
79 *
80 * \code
81 * VectorT<int> integers;
82 * for( Enumerator i(integers.enumerator()); ++i; )
83 * cout << i.current() << '\n';
84 * \endcode
85 */
86class ARCANE_UTILS_EXPORT EnumeratorBase
87{
88 public:
89
90 //! Contruit un énumérateur nul.
91 EnumeratorBase() = default;
92
93 /*!
94 * \brief Contruit un énumérateur associé à l'implémentation \a impl.
95 *
96 * L'instance devient propriétaire de l'implémentation qui est détruite
97 * lorsque l'instance est détruite.
98 */
100 : m_impl(impl)
101 {}
102
103 public:
104
105 void reset() { m_impl->reset(); }
106 bool moveNext() { return m_impl->moveNext(); }
107 void* current() { return m_impl->current(); }
108 const void* current() const { return m_impl->current(); }
109
110 public:
111
112 //! Avance l'énumérateur sur l'élément suivant.
113 bool operator++() { return moveNext(); }
114
115 protected:
116
117 EnumeratorImplBase* _impl() { return m_impl.get(); }
118 const EnumeratorImplBase* _impl() const { return m_impl.get(); }
119
120 private:
121
122 AutoRefT<EnumeratorImplBase> m_impl; //!< Implémentation
123};
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127/*!
128 * \ingroup Collection
129 * \brief Enumérateur typé.
130 *
131 * \todo utiliser des traits pour les types références, pointeur et valeur
132 */
133template <class T>
135: public EnumeratorBase
136{
137 public:
138
139 EnumeratorT() = default;
140 EnumeratorT(const Collection<T>& collection);
141 explicit EnumeratorT(EnumeratorImplBase* impl)
142 : EnumeratorBase(impl)
143 {}
144
145 public:
146
147 const T& current() const { return *_currentPtr(); }
148 T& current() { return *_currentPtr(); }
149
150 public:
151
152 const T& operator*() const { return current(); }
153 T& operator*() { return current(); }
154 const T* operator->() const { return _currentPtr(); }
155 T* operator->() { return _currentPtr(); }
156
157 private:
158
159 T* _currentPtr()
160 {
161 return reinterpret_cast<T*>(_impl()->current());
162 }
163 const T* _currentPtr() const
164 {
165 return reinterpret_cast<const T*>(_impl()->current());
166 }
167};
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
172template <class T> inline EnumeratorT<T>::
173EnumeratorT(const Collection<T>& collection)
174: EnumeratorBase(collection.enumerator())
175{
176}
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
181} // namespace Arcane
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
186#endif
Classe de base d'une collection fortement typée.
Definition Collection.h:115
Enumérateur générique.
Definition Enumerator.h:87
EnumeratorBase()=default
Contruit un énumérateur nul.
bool operator++()
Avance l'énumérateur sur l'élément suivant.
Definition Enumerator.h:113
EnumeratorBase(EnumeratorImplBase *impl)
Contruit un énumérateur associé à l'implémentation impl.
Definition Enumerator.h:99
virtual const void * current() const =0
Objet courant de l'énumérateur.
virtual void * current()=0
Objet courant de l'énumérateur.
virtual bool moveNext()=0
Avance l'énumérateur sur l'élément suivant de la collection.
virtual void reset()=0
Remet à zéro l'énumérateur.
Enumérateur typé.
Definition Enumerator.h:136
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-