20#ifndef _SOURCE_IO_TF_IO_H_
21#define _SOURCE_IO_TF_IO_H_
28#include <unordered_map>
30#include <unordered_set>
35#define TF_IOTOEASY(fileElement, metaData, key, member) {\
36 ::TissueForge::io::IOElement _fe = ::TissueForge::io::IOElement::create(); \
37 if(::TissueForge::io::toFile(member, metaData, _fe) != S_OK) \
39 fileElement.addChild(_fe, key);}
41#define TF_IOFROMEASY(fileElement, metaData, key, member_p) {\
42 ::TissueForge::io::IOChildMap _children = ::TissueForge::io::IOElement::children(fileElement); \
43 ::TissueForge::io::IOChildMap::const_iterator _feItr = _children.find(key); \
44 if(_feItr == _children.end() || ::TissueForge::io::fromFile(_feItr->second, metaData, member_p) != S_OK) \
62 std::unordered_map<std::string, T> children;
65 using IOChildMap = std::unordered_map<std::string, struct IOElement>;
72 std::weak_ptr<_IOElement> el;
75 IOElement(
const IOElement &other) {
79 static IOElement create() {
86 IOElement result = IOElement::create();
87 result._el = this->_el;
88 result.el = this->_el;
92 std::shared_ptr<_IOElement> get() {
98 void addChild(IOElement &child,
const std::string &key) {
99 get()->children[key] = child.clone();
100 child.get()->parent = IOElement(*
this);
107 bool isEmpty() {
return get()->type.size() == 0; }
109 static std::string type(
const IOElement &_e) {
return const_cast<IOElement&
>(_e).get()->type; };
110 static std::string value(
const IOElement &_e) {
return const_cast<IOElement&
>(_e).get()->value; };
111 static IOElement parent(
const IOElement &_e) {
return const_cast<IOElement&
>(_e).get()->parent; };
112 static std::unordered_map<std::string, IOElement> children(
const IOElement &_e) {
return const_cast<IOElement&
>(_e).get()->children; };
117 _el = std::make_shared<_IOElement>();
121 std::shared_ptr<_IOElement> _el;
132 unsigned int versionMajor = TF_VERSION_MAJOR;
133 unsigned int versionMinor = TF_VERSION_MINOR;
134 unsigned int versionPatch = TF_VERSION_PATCH;
146 template <
typename T>
158 template <
typename T>
170 template <
typename T>
187 template <
typename T>
190 fileElement.get()->type =
"Vector2";
191 TF_IOTOEASY(fileElement, metaData,
"x", dataElement.
x());
192 TF_IOTOEASY(fileElement, metaData,
"y", dataElement.
y());
197 template <
typename T>
202 TF_IOFROMEASY(fileElement, metaData,
"x", &de);
203 (*dataElement)[0] = de;
205 TF_IOFROMEASY(fileElement, metaData,
"y", &de);
206 (*dataElement)[1] = de;
213 template <
typename T>
216 fileElement.get()->type =
"Vector3";
217 TF_IOTOEASY(fileElement, metaData,
"x", dataElement.
x());
218 TF_IOTOEASY(fileElement, metaData,
"y", dataElement.
y());
219 TF_IOTOEASY(fileElement, metaData,
"z", dataElement.
z());
224 template <
typename T>
229 TF_IOFROMEASY(fileElement, metaData,
"x", &de);
230 (*dataElement)[0] = de;
232 TF_IOFROMEASY(fileElement, metaData,
"y", &de);
233 (*dataElement)[1] = de;
235 TF_IOFROMEASY(fileElement, metaData,
"z", &de);
236 (*dataElement)[2] = de;
243 template <
typename T>
246 fileElement.get()->type =
"Vector4";
247 TF_IOTOEASY(fileElement, metaData,
"x", dataElement.
x());
248 TF_IOTOEASY(fileElement, metaData,
"y", dataElement.
y());
249 TF_IOTOEASY(fileElement, metaData,
"z", dataElement.
z());
250 TF_IOTOEASY(fileElement, metaData,
"w", dataElement.
w());
255 template <
typename T>
260 TF_IOFROMEASY(fileElement, metaData,
"x", &de);
261 (*dataElement)[0] = de;
263 TF_IOFROMEASY(fileElement, metaData,
"y", &de);
264 (*dataElement)[1] = de;
266 TF_IOFROMEASY(fileElement, metaData,
"z", &de);
267 (*dataElement)[2] = de;
269 TF_IOFROMEASY(fileElement, metaData,
"w", &de);
270 (*dataElement)[3] = de;
277 template <
typename T>
280 fileElement.get()->type =
"Matrix3";
282 for(
unsigned int i = 0; i < 3; i++) {
283 for (
unsigned int j = 0; j < 3; j++) {
284 std::string key = std::to_string(i) + std::to_string(j);
285 TF_IOTOEASY(fileElement, metaData, key, dataElement[i][j]);
292 template <
typename T>
297 for(
unsigned int i = 0; i < 3; i++) {
298 for(
unsigned int j = 0; j < 3; j++) {
299 std::string key = std::to_string(i) + std::to_string(j);
300 TF_IOFROMEASY(fileElement, metaData, key, &de);
301 (*dataElement)[i][j] = de;
310 template <
typename T>
313 fileElement.get()->type =
"Matrix4";
315 for(
unsigned int i = 0; i < 4; i++) {
316 for (
unsigned int j = 0; j < 4; j++) {
317 std::string key = std::to_string(i) + std::to_string(j);
318 TF_IOTOEASY(fileElement, metaData, key, dataElement[i][j]);
325 template <
typename T>
330 for(
unsigned int i = 0; i < 4; i++) {
331 for(
unsigned int j = 0; j < 4; j++) {
332 std::string key = std::to_string(i) + std::to_string(j);
333 TF_IOFROMEASY(fileElement, metaData, key, &de);
334 (*dataElement)[i][j] = de;
343 template <
typename T>
346 fileElement.get()->type =
"Quaternion";
347 TF_IOTOEASY(fileElement, metaData,
"vector", dataElement.
vector());
348 TF_IOTOEASY(fileElement, metaData,
"scalar", dataElement.
scalar());
353 template <
typename T>
356 TF_IOFROMEASY(fileElement, metaData,
"vector", &dataElement->
vector());
357 TF_IOFROMEASY(fileElement, metaData,
"scalar", &dataElement->
scalar());
490 template <
typename T>
492 fileElement.get()->type =
"set";
493 fileElement.get()->children.reserve(dataElement.size());
495 for(
auto de : dataElement) {
496 TF_IOTOEASY(fileElement, metaData, std::to_string(i), de);
502 template <
typename T>
504 unsigned int numEls = IOElement::children(fileElement).size();
505 for(
unsigned int i = 0; i < numEls; i++) {
507 TF_IOFROMEASY(fileElement, metaData, std::to_string(i), &de);
508 dataElement->insert(de);
515 template <
typename T>
517 fileElement.get()->type =
"unordered_set";
518 fileElement.get()->children.reserve(dataElement.size());
520 for(
auto de : dataElement) {
521 TF_IOTOEASY(fileElement, metaData, std::to_string(i), de);
527 template <
typename T>
529 unsigned int numEls = IOElement::children(fileElement).size();
530 for(
unsigned int i = 0; i < numEls; i++) {
532 TF_IOFROMEASY(fileElement, metaData, std::to_string(i), &de);
533 dataElement->insert(de);
540 template <
typename T>
542 fileElement.get()->type =
"vector";
543 fileElement.get()->children.reserve(dataElement.size());
544 for(
unsigned int i = 0; i < dataElement.size(); i++) {
545 TF_IOTOEASY(fileElement, metaData, std::to_string(i), dataElement[i]);
550 template <
typename T>
552 fileElement.get()->type =
"vector";
553 fileElement.get()->children.reserve(dataElement.size());
554 for(
unsigned int i = 0; i < dataElement.size(); i++) {
555 TF_IOTOEASY(fileElement, metaData, std::to_string(i), dataElement[i]);
560 template <
typename T>
562 unsigned int numEls = IOElement::children(fileElement).size();
563 dataElement->reserve(numEls);
564 for(
unsigned int i = 0; i < numEls; i++) {
566 TF_IOFROMEASY(fileElement, metaData, std::to_string(i), &de);
567 dataElement->push_back(de);
574 template <
typename S,
typename T>
576 fileElement.get()->type =
"map";
578 std::vector<S> keysde;
579 std::vector<T> valsde;
581 for(
typename std::map<S, T>::iterator de = dataElement.begin(); de != dataElement.end(); de++) {
582 keysde.push_back(de->first);
583 valsde.push_back(de->second);
586 TF_IOTOEASY(fileElement, metaData,
"keys", keysde);
587 TF_IOTOEASY(fileElement, metaData,
"vals", valsde);
592 template <
typename S,
typename T>
595 std::vector<S> keysde;
596 std::vector<T> valsde;
598 TF_IOFROMEASY(fileElement, metaData,
"keys", &keysde);
599 TF_IOFROMEASY(fileElement, metaData,
"vals", &valsde);
601 for(
unsigned int i = 0; i < keysde.size(); i++) {
602 (*dataElement)[keysde[i]] = valsde[i];
610 template <
typename S,
typename T>
612 fileElement.get()->type =
"unordered_map";
614 std::vector<S> keysde;
615 std::vector<T> valsde;
617 for(
auto de = dataElement.begin(); de != dataElement.end(); de++) {
618 keysde.push_back(de->first);
619 valsde.push_back(de->second);
622 TF_IOTOEASY(fileElement, metaData,
"keys", keysde);
623 TF_IOTOEASY(fileElement, metaData,
"vals", valsde);
628 template <
typename S,
typename T>
631 std::vector<S> keysde;
632 std::vector<T> valsde;
634 TF_IOFROMEASY(fileElement, metaData,
"keys", &keysde);
635 TF_IOFROMEASY(fileElement, metaData,
"vals", &valsde);
637 for(
unsigned int i = 0; i < keysde.size(); i++) {
638 (*dataElement)[keysde[i]] = valsde[i];
TVector3< T > & vector()
Definition tfQuaternion.h:73
T & scalar()
Definition tfQuaternion.h:76
Definition tfVector2.h:35
T & y()
Definition tfVector2.h:61
T & x()
Definition tfVector2.h:58
Definition tfVector3.h:35
T & x()
Definition tfVector3.h:60
T & z()
Definition tfVector3.h:66
T & y()
Definition tfVector3.h:63
T & x()
Definition tfVector4.h:68
T & w()
Definition tfVector4.h:77
T & z()
Definition tfVector4.h:74
T & y()
Definition tfVector4.h:71
Tissue Forge I/O.
Definition tfThreeDFAngleMeshGenerator.h:28
HRESULT toFile(const T &dataElement, const MetaData &metaData, IOElement &fileElement)
Convert an object to an intermediate I/O object.
HRESULT fromFile(const IOElement &fileElement, const MetaData &metaData, T *dataElement)
Instantiate an object from an intermediate I/O object.
Intermediate I/O class for reading/writing Tissue Forge objects to/from file/string.
Definition tf_io.h:58
Container for _IOElement.
Definition tf_io.h:71
int32_t HRESULT
Definition tf_port.h:255