Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
AnyItemLinkVariableArray.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/* AnyItemLinkVariableArray.h (C) 2000-2022 */
9/* */
10/* Variable 2D de liens d'items de types quelconques. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ANYITEM_ANYITEMLINKVARIABLEARRAY_H
13#define ARCANE_ANYITEM_ANYITEMLINKVARIABLEARRAY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/anyitem/AnyItemGlobal.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane::AnyItem
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28/*
29 * \brief Variable de liens d'items de types quelconques.
30 *
31 * Par exemple :
32 *
33 * AnyItem::Variable<Real> variable(family); // Remplie
34 * AnyItem::LinkVariableArray<Real> link_variable(link_family); // Remplie de taille 3
35 *
36 * Real value = 0;
37 * ENUMERATE_ANY_ITEM_LINK(ilink, link_family) {
38 * if(ilink.index() < 10) {
39 * info() << "back item = [uid=" << family.concreteItem(ilink.back()).uniqueId()
40 * << ",lid=" << family.concreteItem(ilink.back()).localId() << ",kind="
41 * << family.concreteItem(ilink.back()).kind() << "]";
42 * info() << "front item = [uid=" << family.concreteItem(ilink.front()).uniqueId()
43 * << ",lid=" << family.concreteItem(ilink.front()).localId() << ",kind="
44 * << family.concreteItem(ilink.front()).kind() << "]";
45 * }
46 *
47 * for(Integer i = 0; i < 3; ++i)
48 * value += link_variable[ilink][i] + variable[ilink.back()][i] + variable[ilink.front()];
49 * }
50 *
51 */
52template<typename DataType>
53class LinkVariableArray
54 : public ILinkFamilyObserver
55{
56public:
57
58 LinkVariableArray(const LinkFamily& family)
59 : m_size(0)
60 , m_family(family)
61 , m_values(m_family.capacity(),m_size)
62 {
63 m_family.registerObserver(*this);
64 }
65
66 LinkVariableArray(const LinkVariableArray& v)
67 : m_size(v.m_size)
69 , m_values(v.m_values)
70 {
71 m_family.registerObserver(*this);
72 }
73
74 ~LinkVariableArray()
75 {
76 arcaneCallFunctionAndTerminateIfThrow([&]() { m_family.removeObserver(*this); });
77 }
78
80 inline ArrayView<DataType> operator[](const LinkFamily::LinkIndex& item) {
81 return m_values[item.index()];
82 }
83
85 inline ConstArrayView<DataType> operator[](const LinkFamily::LinkIndex& item) const {
86 return m_values[item.index()];
87 }
88
91 // Si la famille change, on retaille
92 m_values.resize(m_family.capacity(),m_size);
93 }
94
96 inline void notifyFamilyIsReserved() {
97 // Si la famille est reservée, on retaille simplement
98 m_values.resize(m_family.capacity(),m_size);
99 }
100
102 inline void resize(Integer size)
103 {
104 m_size = size;
105 m_values.resize(m_family.capacity(),m_size);
106 }
107
109 inline Integer size() const { return m_size; }
110
111private:
112
115
118
121};
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
126} // End namespace Arcane::AnyItem
127
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130
131#endif /* ARCANE_ANYITEM_ANYITEMLINKVARIABLEARRAY_H */
void notifyFamilyIsReserved()
Action si la famille est reservée : on retaille.
ArrayView< DataType > operator[](const LinkFamily::LinkIndex &item)
Accesseur.
void notifyFamilyIsInvalidate()
Action si la famille est invalidée : on retaille.
ConstArrayView< DataType > operator[](const LinkFamily::LinkIndex &item) const
Accesseurmake.
Integer size() const
Retourne la taille du tableau.
const LinkFamily m_family
Famille de liens.
Arcane::UniqueArray2< DataType > m_values
Valeurs.
void resize(Integer size)
Redimensionnement de la deuxième dimension du tableau.
Integer m_size
Taille de la 2ème dimension du tableau.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
Interface d'observeurs de famille de liaisons AnyItem.
Famille de liens AnyItem (pattern flyweight)
Vecteur de données 2D avec sémantique par valeur (style STL).
Int32 Integer
Type représentant un entier.
void arcaneCallFunctionAndTerminateIfThrow(std::function< void()> function)