Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ValueChecker.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* ValueChecker.h (C) 2000-2024 */
9/* */
10/* Vérification de la validité de certaines valeurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_VALUECHECKER_H
13#define ARCANE_UTILS_VALUECHECKER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18#include "arcane/utils/OStringStream.h"
19#include "arcane/utils/TraceInfo.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29/*!
30 * \brief Vérification de la validité de certaines valeurs.
31 *
32 * Cette classe fournit un ensemble de méthodes permettant de vérifier
33 * que des valeurs sont conformes à une référence.
34 *
35 * Par défaut, si une valeur est différente de sa référence, une exception
36 * est lancée. Il est possible de changer ce comportement en mettant
37 * setThrowIfError() à \a false. Dans ce cas, il est possible de
38 * lancer manuellement l'exception en appelant throwIfError().
39 */
40class ARCANE_UTILS_EXPORT ValueChecker
41{
42 public:
43
44 ValueChecker(const TraceInfo& ti)
45 : m_trace_info(ti)
46 , m_nb_error(0)
47 , m_throw_on_error(true)
48 {}
49
50 public:
51
52 /*!
53 * Vérifie que \a value et \a expected_value ont les mêmes valeurs.
54 */
55 template <typename T1, typename T2, typename X = std::is_convertible<T2, T1>>
56 void areEqual(const T1& value, const T2& expected_value, const String& message)
57 {
58 if (value != expected_value) {
59 _addError(String::format("{0} value={1} expected={2}", message, value, expected_value));
60 }
61 }
62
63 /*!
64 * \brief Vérifie que les deux tableaux \a values et \a expected_values
65 * ont les mêmes valeurs.
66 */
67 template <typename T1, typename T2,
68 typename ValueType = typename T1::value_type,
69 typename X1 = std::is_convertible<T1, Span<const ValueType>>,
70 typename X2 = std::is_convertible<T1, Span<const ValueType>>>
71 void areEqualArray(const T1& x_values, const T2& x_expected_values,
72 const String& message)
73 {
74 auto values = static_cast<Span<const ValueType>>(x_values);
75 auto expected_values = static_cast<Span<const ValueType>>(x_expected_values);
76
77 Int64 nb_value = values.size();
78 Int64 nb_expected = expected_values.size();
79 if (nb_value != nb_expected) {
80 _addError(String::format("{0} bad array size n={1} expected={2}",
81 message, nb_value, nb_expected));
82 // Ne compare pas les éléments du tableau si les tailles
83 // sont différentes.
84 return;
85 }
86
87 for (Int64 i = 0; i < nb_value; ++i) {
88 const ValueType& v = values[i];
89 const ValueType& e = expected_values[i];
90 if (v != e) {
91 _addError(String::format("{0} index={1} value={2} expected={3}", message, i, v, e));
92 }
93 }
94 }
95
96 /*!
97 * \brief Vérifie que les deux tableaux 2D \a values et \a expected_values
98 * ont les mêmes valeurs.
99 */
100 template <typename T>
101 void areEqualArray(Span2<const T> values, Span2<const T> expected_values,
102 const String& message)
103 {
104 Int64 nb_value = values.dim1Size();
105 Int64 nb_expected = expected_values.dim1Size();
106 if (nb_value != nb_expected) {
107 _addError(String::format("{0} bad array size n={1} expected={2}",
108 message, nb_value, nb_expected));
109 // Ne compare pas les éléments du tableau si les tailles
110 // sont différentes.
111 return;
112 }
113
114 for (Int64 i = 0; i < nb_value; ++i)
115 areEqualArray(values[i], expected_values[i], message);
116 }
117
118 /*!
119 * \brief Vérifie que les deux tableaux \a values et \a expected_values
120 * ont les mêmes valeurs.
121 */
122 template <typename T>
123 void areEqualArray(SmallSpan2<T> values, SmallSpan2<T> expected_values,
124 const String& message)
125 {
126 return areEqualArray(Span2<const T>(values), Span2<const T>(expected_values), message);
127 }
128
129 /*!
130 * \brief Lève une exception si nbError()!=0.
131 */
132 void throwIfError();
133
134 //! Indique si on lève une exception en cas d'erreur
135 void setThrowOnError(bool v)
136 {
137 m_throw_on_error = v;
138 }
139
140 //! Indique si on lève une exception en cas d'erreur
141 bool throwOnError() const { return m_throw_on_error; }
142
143 //! Nombre d'erreurs
144 Integer nbError() const { return m_nb_error; }
145
146 private:
147
148 TraceInfo m_trace_info;
149 Integer m_nb_error;
150 OStringStream m_ostr;
151 String m_last_error_str;
152 bool m_throw_on_error;
153
154 private:
155
156 void _addError(const String& message);
157};
158
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
162} // End namespace Arcane
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166
167#endif
168
Déclarations des types utilisés dans Arcane.
Flot de sortie lié à une String.
Vérification de la validité de certaines valeurs.
void areEqual(const T1 &value, const T2 &expected_value, const String &message)
void areEqualArray(const T1 &x_values, const T2 &x_expected_values, const String &message)
Vérifie que les deux tableaux values et expected_values ont les mêmes valeurs.
void areEqualArray(SmallSpan2< T > values, SmallSpan2< T > expected_values, const String &message)
Vérifie que les deux tableaux values et expected_values ont les mêmes valeurs.
bool throwOnError() const
Indique si on lève une exception en cas d'erreur.
void areEqualArray(Span2< const T > values, Span2< const T > expected_values, const String &message)
Vérifie que les deux tableaux 2D values et expected_values ont les mêmes valeurs.
Integer nbError() const
Nombre d'erreurs.
void setThrowOnError(bool v)
Indique si on lève une exception en cas d'erreur.
Vue pour un tableau 2D dont la taille est un 'Int32'.
Definition Span2.h:233
constexpr __host__ __device__ SizeType dim1Size() const
Nombre d'éléments de la première dimension.
Definition Span2.h:105
Vue pour un tableau 2D dont la taille est un 'Int64'.
Definition Span2.h:301
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-