Home | History | Annotate | Download | only in marisa_alpha
      1 #ifndef MARISA_ALPHA_READER_H_
      2 #define MARISA_ALPHA_READER_H_
      3 
      4 #include <cstdio>
      5 #include <iostream>
      6 
      7 #include "base.h"
      8 
      9 namespace marisa_alpha {
     10 
     11 class Reader {
     12  public:
     13   Reader();
     14   explicit Reader(std::FILE *file);
     15   explicit Reader(int fd);
     16   explicit Reader(std::istream *stream);
     17   ~Reader();
     18 
     19   void open(const char *filename, long offset = 0, int whence = SEEK_SET);
     20 
     21   template <typename T>
     22   void read(T *obj) {
     23     MARISA_ALPHA_THROW_IF(obj == NULL, MARISA_ALPHA_PARAM_ERROR);
     24     read_data(obj, sizeof(T));
     25   }
     26 
     27   template <typename T>
     28   void read(T *objs, std::size_t num_objs) {
     29     MARISA_ALPHA_THROW_IF((objs == NULL) && (num_objs != 0),
     30         MARISA_ALPHA_PARAM_ERROR);
     31     MARISA_ALPHA_THROW_IF(num_objs > (MARISA_ALPHA_UINT32_MAX / sizeof(T)),
     32         MARISA_ALPHA_SIZE_ERROR);
     33     if (num_objs != 0) {
     34       read_data(objs, sizeof(T) * num_objs);
     35     }
     36   }
     37 
     38   bool is_open() const {
     39     return (file_ != NULL) || (fd_ != -1) || (stream_ != NULL);
     40   }
     41 
     42   void clear();
     43   void swap(Reader *rhs);
     44 
     45  private:
     46   std::FILE *file_;
     47   int fd_;
     48   std::istream *stream_;
     49   bool needs_fclose_;
     50 
     51   void read_data(void *buf, std::size_t size);
     52 
     53   // Disallows copy and assignment.
     54   Reader(const Reader &);
     55   Reader &operator=(const Reader &);
     56 };
     57 
     58 }  // namespace marisa_alpha
     59 
     60 #endif  // MARISA_ALPHA_READER_H_
     61