1 2 #ifndef WK_IO_STRING_H 3 #define WK_IO_STRING_H 4 5 #include <locale> 6 #include <sstream> 7 8 #include "wk/io.hpp" 9 10 // for now, the only option is to provide a reference to a string 11 // the string tokenizer operates on a string iterator, which might be 12 // more flexible for the WKT reader but less flexible for other applications 13 class WKStringProvider: public WKProvider { 14 public: 15 virtual const std::string featureString() = 0; 16 }; 17 18 class WKStringExporter: public WKExporter { 19 public: WKStringExporter(size_t size)20 WKStringExporter(size_t size): WKExporter(size) {} 21 virtual void writeString(std::string value) = 0; 22 virtual void writeConstChar(const char* value) = 0; 23 virtual void writeDouble(double value) = 0; 24 virtual void writeUint32(uint32_t value) = 0; 25 }; 26 27 class WKStringStreamExporter: public WKStringExporter { 28 public: WKStringStreamExporter(size_t size)29 WKStringStreamExporter(size_t size): WKStringExporter(size) { 30 this->stream.imbue(std::locale::classic()); 31 } 32 setRoundingPrecision(int precision)33 void setRoundingPrecision(int precision) { 34 this->stream.precision(precision); 35 } 36 setTrim(bool trim)37 void setTrim(bool trim) { 38 if (trim) { 39 this->stream.unsetf(stream.fixed); 40 } else { 41 this->stream.setf(stream.fixed); 42 } 43 } 44 writeString(std::string value)45 void writeString(std::string value) { 46 this->stream << value; 47 } 48 writeConstChar(const char * value)49 void writeConstChar(const char* value) { 50 this->stream << value; 51 } 52 writeDouble(double value)53 void writeDouble(double value) { 54 this->stream << value; 55 } 56 writeUint32(uint32_t value)57 void writeUint32(uint32_t value) { 58 this->stream << value; 59 } 60 61 protected: 62 std::stringstream stream; 63 }; 64 65 #endif 66