1 #ifndef MESH_IO_TEXT_H_INCLUDED
2 #define MESH_IO_TEXT_H_INCLUDED
18 *
\8eQ
\8fÆ
\83I
\83\93\83\8a\81[
\82Ì
\8aÈ
\88Õ
\95¶
\8e\9a\97ñ
\83N
\83\89\83X
30 cstr(const char *begin, const char *end)
31 : begin_(begin), end_(end)
34 bool operator==(const char *rhs)const
37 for(const char *r=rhs; *r; ++r, ++l){
48 bool operator!=(const char *rhs)const
53 bool include(char c)const
55 for(const char *l=begin_; l!=end_; ++l){
63 bool startswith(const char *rhs)
66 for(const char *l=begin_; l!=end_ && *r!='\0'; ++l, ++r){
79 std::string str()const{ return std::string(begin_, end_); }
80 const char* begin()const{ return begin_; }
81 const char* end()const{ return end_; }
82 std::pair<const char*, const char*> range()const{
83 return std::make_pair(begin_, end_);
86 template<typename IsTrim>
87 cstr &trim(IsTrim isTrim){
88 while(begin_!=end_ && isTrim(*begin_)){
91 while(end_!=begin_ && isTrim(end_[-1])){
97 inline std::ostream &operator<<(std::ostream &os, const cstr &rhs)
99 return os << rhs.str();
104 bool operator()(char byte)const
109 case '\r': // fall through
120 bool operator()(char byte)const
125 case '\t': // fall through
136 bool operator()(cstr line)const
142 template<class DELIMITER=IsCRLF,
144 class LINESKIP=IsEmptyLine>
147 binary::IReader &reader_;
148 unsigned int lineCount_;
149 std::vector<char> buf_;
153 LineReader(binary::IReader &reader)
154 : reader_(reader), lineCount_(0), isEnd_(false)
166 if(LINESKIP()(line)){
175 unsigned int getLineCount()const
190 while(char byte=reader_.getChar()){
191 if(DELIMITER()(byte)){
194 buf_.push_back(byte);
197 while(char byte=reader_.getChar()){
198 if(DELIMITER()(byte)){
201 buf_.push_back(byte);
217 if(front>=buf_.size()){
220 if(!TRIM()(buf_[front])){
226 size_t back=buf_.size()-1;
227 for(; back>=0; --back){
228 if(!TRIM()(buf_[back])){
233 return cstr(&buf_[0]+front, &buf_[0]+back+1);
237 template<class DELIMITER=IsSpace>
243 LineSplitter(cstr line)
252 const char *current=line_.begin();
253 for(; current!=line_.end();){
254 for(; current!=line_.end(); ++current){
255 if(!DELIMITER()(*current)){
261 for(; current!=line_.end(); ++current){
262 if(DELIMITER()(*current)){
275 line_=cstr(tail+1, line_.end());
276 return cstr(head, tail);
281 return atoi(get().begin());
286 return static_cast<float>(atof(get().begin()));
289 la::Vector2 getVector2()
293 return la::Vector2(x, y);
296 la::Vector3 getVector3()
301 return la::Vector3(x, y, z);
304 la::Vector4 getVector4()
310 return la::Vector4(x, y, z, w);
313 color::fRGBA getFloatRGBA()
319 return color::fRGBA(r, g, b, a);
322 color::bRGBA getByteRGBA()
328 return color::bRGBA(r, g, b, a);
333 const char *begin=line_.begin();
334 for(; begin!=line_.end(); ++begin){
340 assert(begin<=line_.end());
342 const char *c=begin+1;
343 for(; c!=line_.end(); ++c){
349 cstr token=cstr(begin, c);
352 line_=cstr(c+1, line_.end());
358 inline void copyStringAndFillZero(char *dst, const std::string &src)
361 for(; i<src.size(); ++i)
368 for(; i<src.size(); ++i)
375 inline std::wstring to_WideChar(UINT uCodePage, const std::string &text)
377 int size=MultiByteToWideChar(uCodePage, 0, text.c_str(), -1, NULL, 0);
378 std::vector<wchar_t> buf(size);
379 size=MultiByteToWideChar(uCodePage, 0, text.c_str(), -1, &buf[0], buf.size());
380 return std::wstring(buf.begin(), buf.begin()+size);
383 inline std::string to_MultiByte(UINT uCodePage, const std::wstring &text)
385 int size=WideCharToMultiByte(uCodePage, 0, text.c_str(), -1, NULL, 0, 0, NULL);
386 std::vector<char> buf(size);
387 size=WideCharToMultiByte(uCodePage, 0, text.c_str(), -1, &buf[0], buf.size(), 0, NULL);
388 return std::string(buf.begin(), buf.begin()+size);
391 inline std::string cp932_to_utf8(const std::string &text)
393 return to_MultiByte(CP_UTF8, to_WideChar(CP_OEMCP, text));
396 inline std::wstring trim(const std::wstring &src){
397 std::wstring::const_iterator end=src.begin();
398 for(; end!=src.end(); ++end){
403 return std::wstring(src.begin(), end);
408 } // namespace meshio
409 #endif // MESH_IO_TEXT_H_INCLUDED