csvarchive.hh
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. #ifndef CSVARCHIVE_HH_
  19. #define CSVARCHIVE_HH_
  20. #include "recordio.hh"
  21. namespace hadoop {
  22. class PushBackInStream {
  23. private:
  24.   InStream* stream;
  25.   bool isAvail;
  26.   char pbchar;
  27. public:
  28.   void setStream(InStream* stream_) {
  29.     stream = stream_;
  30.     isAvail = false;
  31.     pbchar = 0;
  32.   }
  33.   ssize_t read(void* buf, size_t len) {
  34.     if (len > 0 && isAvail) {
  35.       char* p = (char*) buf;
  36.       *p = pbchar;
  37.       isAvail = false;
  38.       if (len > 1) {
  39.         ssize_t ret = stream->read((char*)buf + 1, len - 1);
  40.         return ret + 1;
  41.       } else {
  42.         return 1;
  43.       }
  44.     } else {
  45.       return stream->read(buf, len);
  46.     }
  47.   }
  48.   void pushBack(char c) {
  49.     pbchar = c;
  50.     isAvail = true;
  51.   }
  52. };
  53. class CsvIndex : public Index {
  54. private:
  55.   PushBackInStream& stream;
  56. public:
  57.   CsvIndex(PushBackInStream& _stream) : stream(_stream) {}
  58.   bool done() {
  59.     char c;
  60.     stream.read(&c, 1);
  61.     if (c != ',') {
  62.       stream.pushBack(c);
  63.     }
  64.     return (c == '}') ? true : false;
  65.   }
  66.   void incr() {}
  67.   ~CsvIndex() {} 
  68. };
  69.   
  70. class ICsvArchive : public IArchive {
  71. private:
  72.   PushBackInStream stream;
  73. public:
  74.   ICsvArchive(InStream& _stream) { stream.setStream(&_stream); }
  75.   virtual void deserialize(int8_t& t, const char* tag);
  76.   virtual void deserialize(bool& t, const char* tag);
  77.   virtual void deserialize(int32_t& t, const char* tag);
  78.   virtual void deserialize(int64_t& t, const char* tag);
  79.   virtual void deserialize(float& t, const char* tag);
  80.   virtual void deserialize(double& t, const char* tag);
  81.   virtual void deserialize(std::string& t, const char* tag);
  82.   virtual void deserialize(std::string& t, size_t& len, const char* tag);
  83.   virtual void startRecord(Record& s, const char* tag);
  84.   virtual void endRecord(Record& s, const char* tag);
  85.   virtual Index* startVector(const char* tag);
  86.   virtual void endVector(Index* idx, const char* tag);
  87.   virtual Index* startMap(const char* tag);
  88.   virtual void endMap(Index* idx, const char* tag);
  89.   virtual ~ICsvArchive();
  90. };
  91. class OCsvArchive : public OArchive {
  92. private:
  93.   OutStream& stream;
  94.   bool isFirst;
  95.   
  96.   void printCommaUnlessFirst() {
  97.     if (!isFirst) {
  98.       stream.write(",",1);
  99.     }
  100.     isFirst = false;
  101.   }
  102. public:
  103.   OCsvArchive(OutStream& _stream) : stream(_stream) {isFirst = true;}
  104.   virtual void serialize(int8_t t, const char* tag);
  105.   virtual void serialize(bool t, const char* tag);
  106.   virtual void serialize(int32_t t, const char* tag);
  107.   virtual void serialize(int64_t t, const char* tag);
  108.   virtual void serialize(float t, const char* tag);
  109.   virtual void serialize(double t, const char* tag);
  110.   virtual void serialize(const std::string& t, const char* tag);
  111.   virtual void serialize(const std::string& t, size_t len, const char* tag);
  112.   virtual void startRecord(const Record& s, const char* tag);
  113.   virtual void endRecord(const Record& s, const char* tag);
  114.   virtual void startVector(size_t len, const char* tag);
  115.   virtual void endVector(size_t len, const char* tag);
  116.   virtual void startMap(size_t len, const char* tag);
  117.   virtual void endMap(size_t len, const char* tag);
  118.   virtual ~OCsvArchive();
  119. };
  120. }
  121. #endif /*CSVARCHIVE_HH_*/