IOSS 2.0
Loading...
Searching...
No Matches
Ioss_VariableType.h
Go to the documentation of this file.
1// Copyright(C) 1999-2024 National Technology & Engineering Solutions
2// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
3// NTESS, the U.S. Government retains certain rights in this software.
4//
5// See packages/seacas/LICENSE for details
6
7#pragma once
8
9#include "Ioss_CodeTypes.h"
10#include "Ioss_Utils.h"
11#include <cstring> // for strncmp
12#include <functional> // for less
13#include <map> // for map, map<>::value_compare
14#include <string> // for string, operator<
15#include <vector> // for vector
16
17#include "ioss_export.h"
18
19namespace Ioss {
20 class VariableType;
21} // namespace Ioss
22
23namespace Ioss {
24 using VariableTypeMap = std::map<std::string, VariableType *, std::less<>>;
25 using VTM_ValuePair = VariableTypeMap::value_type;
26
27 class IOSS_EXPORT Registry
28 {
29 public:
30 void insert(const Ioss::VTM_ValuePair &value, bool delete_me);
31 IOSS_NODISCARD VariableTypeMap::iterator begin() { return m_registry.begin(); }
32 IOSS_NODISCARD VariableTypeMap::iterator end() { return m_registry.end(); }
33 IOSS_NODISCARD VariableTypeMap::iterator find(const std::string &type)
34 {
35 return m_registry.find(type);
36 }
37
38 ~Registry();
39 std::map<std::string, std::string> customFieldTypes;
40
41 private:
43 std::vector<Ioss::VariableType *> m_deleteThese;
44 };
45
46 struct IOSS_EXPORT Suffix
47 {
48 explicit Suffix(const char *new_data) : m_data(new_data) {}
49 explicit Suffix(std::string new_data) : m_data(std::move(new_data)) {}
50 IOSS_NODISCARD bool operator==(const std::string &str) const
51 {
52 return Utils::str_equal(m_data, str);
53 }
54 IOSS_NODISCARD bool operator!=(const std::string &str) const
55 {
56 return !Utils::str_equal(m_data, str);
57 }
58 IOSS_NODISCARD bool is_uppercase() const { return isalpha(m_data[0]) && isupper(m_data[0]); }
59
60 std::string m_data{};
61 };
62
63 /** \brief A generic variable type
64 */
65 class IOSS_EXPORT VariableType
66 {
67 public:
68 static void alias(const std::string &base, const std::string &syn);
69 static int describe(NameList *names);
70 IOSS_NODISCARD static NameList describe();
71 static bool create_named_suffix_field_type(const std::string &type_name,
72 const std::vector<std::string> &suffices);
73 static bool get_field_type_mapping(const std::string &field, std::string *type);
74 static bool add_field_type_mapping(const std::string &raw_field, const std::string &raw_type);
75
76 VariableType(const VariableType &) = delete;
78 virtual ~VariableType() = default;
79
80 IOSS_NODISCARD int component_count() const;
81
82 // Override this function if the derived class has no suffices
83 // For example, a 'vector_2d' has suffices "x" and "y"
84 // A 'quad4' has no suffices...
85 IOSS_NODISCARD virtual int suffix_count() const;
86 IOSS_NODISCARD std::string name() const;
87
88 IOSS_NODISCARD static std::string numeric_label(int which, int ncomp, const std::string &name);
89 IOSS_NODISCARD virtual std::string label(int which, char suffix_sep = '_') const = 0;
90 IOSS_NODISCARD virtual std::string label_name(const std::string &base, int which,
91 char suffix_sep = '_',
92 bool suffices_uppercase = false) const;
93 IOSS_NODISCARD virtual bool match(const std::vector<Suffix> &suffices) const;
94
95 IOSS_NODISCARD static const VariableType *factory(const std::string &raw_name, int copies = 1);
96 IOSS_NODISCARD static const VariableType *factory(const std::vector<Suffix> &suffices,
97 bool ignore_realn_fields = false);
98
99 protected:
100 VariableType(const std::string &type, int comp_count, bool delete_me = false);
101 static Registry &registry();
102
103 private:
104 const std::string name_;
106
107 static bool build_variable_type(const std::string &raw_type);
108 };
109} // namespace Ioss
110inline std::string Ioss::VariableType::name() const { return name_; }
111
112inline int Ioss::VariableType::component_count() const { return componentCount; }
113
114inline int Ioss::VariableType::suffix_count() const { return componentCount; }
#define IOSS_NODISCARD
Definition Ioss_CodeTypes.h:54
Definition Ioss_VariableType.h:28
IOSS_NODISCARD VariableTypeMap::iterator begin()
Definition Ioss_VariableType.h:31
IOSS_NODISCARD VariableTypeMap::iterator find(const std::string &type)
Definition Ioss_VariableType.h:33
std::map< std::string, std::string > customFieldTypes
Definition Ioss_VariableType.h:39
Ioss::VariableTypeMap m_registry
Definition Ioss_VariableType.h:42
IOSS_NODISCARD VariableTypeMap::iterator end()
Definition Ioss_VariableType.h:32
std::vector< Ioss::VariableType * > m_deleteThese
Definition Ioss_VariableType.h:43
A generic variable type.
Definition Ioss_VariableType.h:66
const std::string name_
Definition Ioss_VariableType.h:104
VariableType & operator=(const VariableType &)=delete
VariableType(const VariableType &)=delete
virtual IOSS_NODISCARD std::string label(int which, char suffix_sep='_') const =0
IOSS_NODISCARD std::string name() const
Definition Ioss_VariableType.h:110
virtual IOSS_NODISCARD int suffix_count() const
Definition Ioss_VariableType.h:114
virtual ~VariableType()=default
IOSS_NODISCARD int component_count() const
Definition Ioss_VariableType.h:112
int componentCount
Definition Ioss_VariableType.h:105
The main namespace for the Ioss library.
Definition Ioad_DatabaseIO.C:40
VariableTypeMap::value_type VTM_ValuePair
Definition Ioss_VariableType.h:25
std::map< std::string, VariableType *, std::less<> > VariableTypeMap
Definition Ioss_VariableType.h:24
std::vector< std::string > NameList
Definition Ioss_CodeTypes.h:23
Definition Ioss_VariableType.h:47
IOSS_NODISCARD bool is_uppercase() const
Definition Ioss_VariableType.h:58
IOSS_NODISCARD bool operator==(const std::string &str) const
Definition Ioss_VariableType.h:50
Suffix(std::string new_data)
Definition Ioss_VariableType.h:49
IOSS_NODISCARD bool operator!=(const std::string &str) const
Definition Ioss_VariableType.h:54
Suffix(const char *new_data)
Definition Ioss_VariableType.h:48