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