14#include "arcane/utils/ArcanePrecomp.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/ArgumentException.h"
20#include "arcane/utils/Array.h"
21#include "arcane/utils/TraceInfo.h"
23#include "arcane/FactoryService.h"
24#include "arcane/AbstractService.h"
25#include "arcane/IPhysicalUnitSystemService.h"
26#include "arcane/IPhysicalUnitSystem.h"
27#include "arcane/IPhysicalUnitConverter.h"
28#include "arcane/IPhysicalUnit.h"
37class UdunitsPhysicalUnitConverter;
38class UdunitsPhysicalUnit;
39class UdunitsPhysicalUnitSystem;
44class UdunitsPhysicalUnit
49 friend class UdunitsPhysicalUnitSystem;
53 UdunitsPhysicalUnit(UdunitsPhysicalUnitSystem*,::ut_unit* unit,
58 m_name = String::fromUtf8(
name.utf8());
61 UdunitsPhysicalUnit(::ut_unit* unit)
66 virtual ~UdunitsPhysicalUnit()
86class UdunitsPhysicalUnitConverter
94 ::cv_converter* converter)
95 : m_from_unit(from_unit), m_to_unit(to_unit), m_is_from_owned(
true),
96 m_is_to_owned(
true), m_converter(converter)
100 ~UdunitsPhysicalUnitConverter()
112 double new_value = cv_convert_double(m_converter,value);
122 throw ArgumentException(A_FUNCINFO,
"input and ouput arrays do not have the same number of elements");
123 cv_convert_doubles(m_converter,input_values.
data(),nb,output_values.
data());
141 bool m_is_from_owned;
143 ::cv_converter* m_converter;
149class UdunitsPhysicalUnitSystem
160 virtual ~UdunitsPhysicalUnitSystem()
163 ut_free_system(m_unit_system);
169 _checkCreateUnitSystem();
172 if (!from_unit || !to_unit)
174 return _createConverter(from_unit,to_unit);
179 info() <<
"Create unit converter from='" << from <<
"' to='" << to <<
"'";
180 _checkCreateUnitSystem();
184 return _createConverter(from_unit,to_unit);
191 ::cv_converter* cv_cvt = ::ut_get_converter(from_unit->m_unit,to_unit->m_unit);
194 String::format(
"Can not convert from '{0}' to '{1}' because units are not convertible",
195 from_unit->
name(),to_unit->
name()));
200 void _checkCreateUnitSystem()
204 m_unit_system = ut_read_xml(0);
206 throw FatalErrorException(A_FUNCINFO,
"Can not load unit system");
209 UdunitsPhysicalUnit* _createUnit(
const String& name)
211 ::ut_unit* unit = ut_parse(m_unit_system,(
const char*)name.utf8().data(),UT_UTF8);
213 throw FatalErrorException(A_FUNCINFO,String::format(
"Can not create unit from string '{0}'",name));
214 return new UdunitsPhysicalUnit(
this,unit,name);
222 ::ut_system* m_unit_system;
230class UdunitsUnitSystemService
237 virtual ~UdunitsUnitSystemService() {}
241 virtual void build();
264UdunitsUnitSystemService::
265UdunitsUnitSystemService(
const ServiceBuildInfo& sbi)
266: AbstractService(sbi)
#define ARCANE_REGISTER_APPLICATION_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
Exception lorsqu'un argument est invalide.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Exception lorsqu'une erreur fatale est survenue.
Interface d'un convertisseur d'unité.
Interface d'un service gérant un système d'unité.
Interface d'un système d'unité.
Interface du gestionnaire de traces.
Structure contenant les informations pour créer un service.
Chaîne de caractères unicode.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
virtual IPhysicalUnit * fromUnit()
Unité de départ.
virtual void convert(RealConstArrayView input_values, RealArrayView output_values)
Retourne dans output_values les valeurs converties de input_values.
virtual Real convert(Real value)
Retourne la valeur convertie de value.
virtual IPhysicalUnit * toUnit()
Unité d'arrivée.
virtual IPhysicalUnitConverter * createConverter(const String &from, const String &to)
Créé un convertisseur entre deux unités. L'appelant doit détruire le convertisseur retourné.
virtual IPhysicalUnitConverter * createConverter(IPhysicalUnit *from, IPhysicalUnit *to)
Créé un convertisseur entre deux unités. L'appelant doit détruire le convertisseur retourné....
virtual const String & name() const
Nom de l'unité
Service de gestion de système d'unité physique utilisant 'udunits2'.
virtual void build()
Construction de niveau build du service.
virtual IPhysicalUnitSystem * createStandardUnitSystem()
Crée un système d'unité pour le Système International SI.
Int32 Integer
Type représentant un entier.
double Real
Type représentant un réel.
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.