#ifndef MARISA_ALPHA_READER_H_
#define MARISA_ALPHA_READER_H_

#include <cstdio>
#include <iostream>

#include "base.h"

namespace marisa_alpha {

class Reader {
 public:
  Reader();
  explicit Reader(std::FILE *file);
  explicit Reader(int fd);
  explicit Reader(std::istream *stream);
  ~Reader();

  void open(const char *filename, long offset = 0, int whence = SEEK_SET);

  template <typename T>
  void read(T *obj) {
    MARISA_ALPHA_THROW_IF(obj == NULL, MARISA_ALPHA_PARAM_ERROR);
    read_data(obj, sizeof(T));
  }

  template <typename T>
  void read(T *objs, std::size_t num_objs) {
    MARISA_ALPHA_THROW_IF((objs == NULL) && (num_objs != 0),
        MARISA_ALPHA_PARAM_ERROR);
    MARISA_ALPHA_THROW_IF(num_objs > (MARISA_ALPHA_UINT32_MAX / sizeof(T)),
        MARISA_ALPHA_SIZE_ERROR);
    if (num_objs != 0) {
      read_data(objs, sizeof(T) * num_objs);
    }
  }

  bool is_open() const {
    return (file_ != NULL) || (fd_ != -1) || (stream_ != NULL);
  }

  void clear();
  void swap(Reader *rhs);

 private:
  std::FILE *file_;
  int fd_;
  std::istream *stream_;
  bool needs_fclose_;

  void read_data(void *buf, std::size_t size);

  // Disallows copy and assignment.
  Reader(const Reader &);
  Reader &operator=(const Reader &);
};

}  // namespace marisa_alpha

#endif  // MARISA_ALPHA_READER_H_
