From 8ba0494485720bad9467e754ce0f99fc0373d87b Mon Sep 17 00:00:00 2001 From: Guido Cossu Date: Mon, 8 May 2017 21:41:39 +0100 Subject: [PATCH] Fixing JSON for complex numbers --- lib/serialisation/JSON_IO.cc | 1 + lib/serialisation/JSON_IO.h | 65 ++++++++++++++++++++++++++-------- tests/IO/Test_serialisation.cc | 11 +++--- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/lib/serialisation/JSON_IO.cc b/lib/serialisation/JSON_IO.cc index f6cb7871..fb461998 100644 --- a/lib/serialisation/JSON_IO.cc +++ b/lib/serialisation/JSON_IO.cc @@ -43,6 +43,7 @@ JSONWriter::~JSONWriter(void) cout << ss_.str() << endl; // write prettified JSON to file std::ofstream os(fileName_); + std::cout << "Writing on file" << std::endl; os << std::setw(2) << json::parse(ss_.str()) << std::endl; } diff --git a/lib/serialisation/JSON_IO.h b/lib/serialisation/JSON_IO.h index 0d9ed33c..e3c849a4 100644 --- a/lib/serialisation/JSON_IO.h +++ b/lib/serialisation/JSON_IO.h @@ -1,6 +1,6 @@ /************************************************************************************* - Grid physics library, www.github.com/paboyle/Grid + Grid physics library, www.github.com/paboyle/Grid Source file: ./lib/serialisation/JSON_IO.h @@ -43,10 +43,10 @@ using json = nlohmann::json; namespace Grid { - + class JSONWriter: public Writer { - + public: JSONWriter(const std::string &fileName); virtual ~JSONWriter(void); @@ -55,6 +55,8 @@ namespace Grid template void writeDefault(const std::string &s, const U &x); template + void writeDefault(const std::string &s, const std::complex &x); + template void writeDefault(const std::string &s, const std::vector &x); template @@ -65,7 +67,7 @@ namespace Grid std::string fileName_; std::ostringstream ss_; }; - + class JSONReader: public Reader { public: @@ -77,6 +79,8 @@ namespace Grid template void readDefault(const std::string &s, U &output); template + void readDefault(const std::string &s, std::complex &output); + template void readDefault(const std::string &s, std::vector &output); private: json jobject_; // main object @@ -97,11 +101,12 @@ namespace Grid struct isWriter< JSONWriter > { static const bool value = true; }; - + // Writer template implementation //////////////////////////////////////////// template void JSONWriter::writeDefault(const std::string &s, const U &x) { + std::cout << "JSONReader::writeDefault(U) : " << s << std::endl; std::ostringstream os; os << std::boolalpha << x; if (s.size()) @@ -110,9 +115,23 @@ namespace Grid ss_ << os.str() << " ," ; } + template + void JSONWriter::writeDefault(const std::string &s, const std::complex &x) + { + std::cout << "JSONReader::writeDefault(complex) : " << s << std::endl; + std::ostringstream os; + os << "["<< std::boolalpha << x.real() << ", " << x.imag() << "]"; + if (s.size()) + ss_ << "\""<< s << "\" : " << os.str() << " ," ; + else + ss_ << os.str() << " ," ; + } + template void JSONWriter::writeDefault(const std::string &s, const std::vector &x) { + std::cout << "JSONReader::writeDefault(vec U) : " << s << std::endl; + if (s.size()) ss_ << " \""< void JSONWriter::writeDefault(const std::string &s, const char(&x)[N]){ + std::cout << "JSONReader::writeDefault(char U) : " << s << std::endl; + if (s.size()) ss_ << "\""<< s << "\" : \"" << x << "\" ," ; else - ss_ << "\"" << x << "\" ," ; + ss_ << "\"" << x << "\" ," ; } // Reader template implementation //////////////////////////////////////////// @@ -138,7 +159,7 @@ namespace Grid void JSONReader::readDefault(const std::string &s, U &output) { std::cout << "JSONReader::readDefault(U) : " << s << " : "<< jcur_ << std::endl; - + if (s.size()){ std::cout << "String: "<< jcur_[s] << std::endl; output = jcur_[s]; @@ -146,15 +167,31 @@ namespace Grid else { std::cout << "String: "<< jcur_ << std::endl; - output = jcur_; + output = jcur_; } } - + + template + void JSONReader::readDefault(const std::string &s, std::complex &output) + { + U tmp1, tmp2; + std::cout << "JSONReader::readDefault( complex U) : " << s << " : "<< jcur_ << std::endl; + json j = jcur_; + json::iterator it = j.begin(); + jcur_ = *it; + read("", tmp1); + it++; + jcur_ = *it; + read("", tmp2); + output = std::complex(tmp1,tmp2); + } + + template <> void JSONReader::readDefault(const std::string &s, std::string &output); - + template void JSONReader::readDefault(const std::string &s, std::vector &output) { @@ -163,7 +200,7 @@ namespace Grid std::cout << "JSONReader::readDefault(vec) : " << jcur_ << std::endl; if (s.size()) push(s); - + json j = jcur_; for (json::iterator it = j.begin(); it != j.end(); ++it) { jcur_ = *it; @@ -171,12 +208,12 @@ namespace Grid output.resize(i + 1); read("", output[i++]); } - + jcur_ = j; if (s.size()) pop(); } - + } #endif diff --git a/tests/IO/Test_serialisation.cc b/tests/IO/Test_serialisation.cc index 384a001f..6272f66e 100644 --- a/tests/IO/Test_serialisation.cc +++ b/tests/IO/Test_serialisation.cc @@ -214,6 +214,7 @@ int main(int argc,char **argv) // test serializable class writing myclass obj(1234); // non-trivial constructor + std::cout << "-- serialisable class writing to 'bother.json'..." << std::endl; write(JW,"obj",obj); JW.write("obj2", obj); @@ -232,11 +233,11 @@ int main(int argc,char **argv) myclass jcopy1; std::vector jveccopy1; read(RD,"obj",jcopy1); - read(RD,"objvec", jveccopy1); - std::cout << "Loaded (JSON) -----------------" << std::endl; - std::cout << jcopy1 << std::endl << jveccopy1 << std::endl; + //read(RD,"objvec", jveccopy1); + //std::cout << "Loaded (JSON) -----------------" << std::endl; + //std::cout << jcopy1 << std::endl << jveccopy1 << std::endl; } - + /* { // Testing the next element function JSONReader RD("test.json"); @@ -245,7 +246,7 @@ int main(int argc,char **argv) std::string name; read(RD,"name", name); } - +*/ }