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