1f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#ifndef MARISA_WRITER_H_
2f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#define MARISA_WRITER_H_
3f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
4f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#include <cstdio>
5f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#include <iostream>
6f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
7f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#include "base.h"
8f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
9f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamathnamespace marisa {
10f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
11f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamathclass Writer {
12f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath public:
13f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  Writer();
14f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  explicit Writer(std::FILE *file);
15f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  explicit Writer(int fd);
16f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  explicit Writer(std::ostream *stream);
17f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  ~Writer();
18f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
19f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  void open(const char *filename, bool trunc_flag = true,
20f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath      long offset = 0, int whence = SEEK_SET);
21f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
22f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  template <typename T>
23f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  void write(const T &obj) {
24f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    write_data(&obj, sizeof(T));
25f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
26f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
27f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  template <typename T>
28f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  void write(const T *objs, std::size_t num_objs) {
29f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    MARISA_THROW_IF((objs == NULL) && (num_objs != 0), MARISA_PARAM_ERROR);
30f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    MARISA_THROW_IF(num_objs > (MARISA_UINT32_MAX / sizeof(T)),
31f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath        MARISA_SIZE_ERROR);
32f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    if (num_objs != 0) {
33f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath      write_data(objs, sizeof(T) * num_objs);
34f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    }
35f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
36f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
37f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  bool is_open() const {
38f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    return (file_ != NULL) || (fd_ != -1) || (stream_ != NULL);
39f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
40f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
41f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  void clear();
42f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  void swap(Writer *rhs);
43f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
44f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath private:
45f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  std::FILE *file_;
46f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  int fd_;
47f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  std::ostream *stream_;
48f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  bool needs_fclose_;
49f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
50f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  void write_data(const void *data, std::size_t size);
51f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
52f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  // Disallows copy and assignment.
53f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  Writer(const Writer &);
54f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  Writer &operator=(const Writer &);
55f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath};
56f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
57f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath}  // namespace marisa
58f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
59f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#endif  // MARISA_WRITER_H_
60