1 /*****************************************************************************/
2 /*                                    XDMF                                   */
3 /*                       eXtensible Data Model and Format                    */
4 /*                                                                           */
5 /*  Id : XdmfGeometryType.cpp                                                */
6 /*                                                                           */
7 /*  Author:                                                                  */
8 /*     Kenneth Leiter                                                        */
9 /*     kenneth.leiter@arl.army.mil                                           */
10 /*     US Army Research Laboratory                                           */
11 /*     Aberdeen Proving Ground, MD                                           */
12 /*                                                                           */
13 /*     Copyright @ 2011 US Army Research Laboratory                          */
14 /*     All Rights Reserved                                                   */
15 /*     See Copyright.txt for details                                         */
16 /*                                                                           */
17 /*     This software is distributed WITHOUT ANY WARRANTY; without            */
18 /*     even the implied warranty of MERCHANTABILITY or FITNESS               */
19 /*     FOR A PARTICULAR PURPOSE.  See the above copyright notice             */
20 /*     for more information.                                                 */
21 /*                                                                           */
22 /*****************************************************************************/
23 
24 #include <utility>
25 #include "XdmfGeometryType.hpp"
26 #include "XdmfError.hpp"
27 #include "string.h"
28 
29 std::map<std::string, shared_ptr<const XdmfGeometryType>(*)()> XdmfGeometryType::mGeometryDefinitions;
30 
31 // Supported XdmfGeometryTypes
32 shared_ptr<const XdmfGeometryType>
NoGeometryType()33 XdmfGeometryType::NoGeometryType()
34 {
35   static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("None", 0));
36   return p;
37 }
38 
39 shared_ptr<const XdmfGeometryType>
XYZ()40 XdmfGeometryType::XYZ()
41 {
42   static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("XYZ", 3));
43   return p;
44 }
45 
46 shared_ptr<const XdmfGeometryType>
XY()47 XdmfGeometryType::XY()
48 {
49   static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("XY", 2));
50   return p;
51 }
52 
53 shared_ptr<const XdmfGeometryType>
Polar()54 XdmfGeometryType::Polar()
55 {
56   static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("Polar", 2));
57   return p;
58 }
59 
60 shared_ptr<const XdmfGeometryType>
Spherical()61 XdmfGeometryType::Spherical()
62 {
63   static shared_ptr<const XdmfGeometryType> p(new XdmfGeometryType("Spherical", 3));
64   return p;
65 }
66 
67 void
InitTypes()68 XdmfGeometryType::InitTypes()
69 {
70   mGeometryDefinitions["NONE"] = NoGeometryType;
71   mGeometryDefinitions["XYZ"] = XYZ;
72   mGeometryDefinitions["XY"] = XY;
73   mGeometryDefinitions["POLAR"] = Polar;
74   mGeometryDefinitions["SPHERICAL"] = Spherical;
75 }
76 
XdmfGeometryType(const std::string & name,const int & dimensions)77 XdmfGeometryType::XdmfGeometryType(const std::string& name,
78                                    const int& dimensions) :
79   mDimensions(dimensions),
80   mName(name)
81 {
82 }
83 
~XdmfGeometryType()84 XdmfGeometryType::~XdmfGeometryType()
85 {
86 }
87 
88 shared_ptr<const XdmfGeometryType>
New(const std::map<std::string,std::string> & itemProperties)89 XdmfGeometryType::New(const std::map<std::string, std::string> & itemProperties)
90 {
91   InitTypes();
92 
93   std::map<std::string, std::string>::const_iterator type =
94     itemProperties.find("Type");
95   if(type == itemProperties.end()) {
96     type = itemProperties.find("GeometryType");
97   }
98   if(type == itemProperties.end()) {
99     XdmfError::message(XdmfError::FATAL,
100                        "Neither 'Type' nor 'GeometryType' in itemProperties "
101                        "in XdmfGeometryType::New");
102   }
103 
104   const std::string & typeVal = ConvertToUpper(type->second);
105 
106   std::map<std::string, shared_ptr<const XdmfGeometryType>(*)()>::const_iterator returnType
107     = mGeometryDefinitions.find(typeVal);
108 
109   if (returnType == mGeometryDefinitions.end()) {
110     XdmfError::message(XdmfError::FATAL, "Type "
111                      + typeVal + " not Supported "
112                      "in XdmfGeometryType::New");
113   }
114   else {
115     return (*(returnType->second))();
116   }
117 
118   return shared_ptr<const XdmfGeometryType>();
119 }
120 
121 unsigned int
getDimensions() const122 XdmfGeometryType::getDimensions() const
123 {
124   return mDimensions;
125 }
126 
127 std::string
getName() const128 XdmfGeometryType::getName() const
129 {
130   return mName;
131 }
132 
133 void
getProperties(std::map<std::string,std::string> & collectedProperties) const134 XdmfGeometryType::getProperties(std::map<std::string, std::string> & collectedProperties) const
135 {
136   collectedProperties.insert(std::make_pair("Type", mName));
137 }
138 
139 // C Wrappers
140 
XdmfGeometryTypeNoGeometryType()141 int XdmfGeometryTypeNoGeometryType()
142 {
143   return XDMF_GEOMETRY_TYPE_NO_GEOMETRY_TYPE;
144 }
145 
XdmfGeometryTypeXYZ()146 int XdmfGeometryTypeXYZ()
147 {
148   return XDMF_GEOMETRY_TYPE_XYZ;
149 }
150 
XdmfGeometryTypeXY()151 int XdmfGeometryTypeXY()
152 {
153   return XDMF_GEOMETRY_TYPE_XY;
154 }
155 
XdmfGeometryTypePolar()156 int XdmfGeometryTypePolar()
157 {
158   return XDMF_GEOMETRY_TYPE_POLAR;
159 }
160 
XdmfGeometryTypeSpherical()161 int XdmfGeometryTypeSpherical()
162 {
163   return XDMF_GEOMETRY_TYPE_SPHERICAL;
164 }
165 
XdmfGeometryTypeGetDimensions(int type,int * status)166 unsigned int XdmfGeometryTypeGetDimensions(int type, int * status)
167 {
168   XDMF_ERROR_WRAP_START(status)
169   switch (type) {
170     case XDMF_GEOMETRY_TYPE_NO_GEOMETRY_TYPE:
171       return XdmfGeometryType::NoGeometryType()->getDimensions();
172       break;
173     case XDMF_GEOMETRY_TYPE_XYZ:
174       return XdmfGeometryType::XYZ()->getDimensions();
175       break;
176     case XDMF_GEOMETRY_TYPE_XY:
177       return XdmfGeometryType::XY()->getDimensions();
178       break;
179     case XDMF_GEOMETRY_TYPE_POLAR:
180       return XdmfGeometryType::Polar()->getDimensions();
181       break;
182     case XDMF_GEOMETRY_TYPE_SPHERICAL:
183       return XdmfGeometryType::Spherical()->getDimensions();
184       break;
185     default:
186       try {
187         XdmfError::message(XdmfError::FATAL,
188                            "Error: Invalid Geometry Type: Code " + type);
189       }
190       catch (XdmfError & e) {
191         throw e;
192       }
193       break;
194   }
195   XDMF_ERROR_WRAP_END(status)
196   return 0;
197 }
198 
XdmfGeometryTypeGetName(int type)199 char * XdmfGeometryTypeGetName(int type)
200 {
201   switch (type) {
202     case XDMF_GEOMETRY_TYPE_NO_GEOMETRY_TYPE:
203     {
204       char * returnPointer = strdup(XdmfGeometryType::NoGeometryType()->getName().c_str());
205       return returnPointer;
206       break;
207     }
208     case XDMF_GEOMETRY_TYPE_XYZ:
209     {
210       char * returnPointer = strdup(XdmfGeometryType::XYZ()->getName().c_str());
211       return returnPointer;
212       break;
213     }
214     case XDMF_GEOMETRY_TYPE_XY:
215     {
216       char * returnPointer = strdup(XdmfGeometryType::XY()->getName().c_str());
217       return returnPointer;
218       break;
219     }
220     case XDMF_GEOMETRY_TYPE_POLAR:
221     {
222       char * returnPointer = strdup(XdmfGeometryType::Polar()->getName().c_str());
223       return returnPointer;
224       break;
225     }
226     case XDMF_GEOMETRY_TYPE_SPHERICAL:
227     {
228       char * returnPointer = strdup(XdmfGeometryType::Spherical()->getName().c_str());
229       return returnPointer;
230       break;
231     }
232     default:
233     {
234       char * returnPointer = NULL;
235       return returnPointer;
236       break;
237     }
238   }
239 }
240