1b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#ifndef MARISA_ALPHA_CONTAINER_H_
2b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#define MARISA_ALPHA_CONTAINER_H_
3b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
4b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#include <vector>
5b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
6b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#include "base.h"
7b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
8b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaknamespace marisa_alpha {
9b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
10b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaktemplate <typename T>
11b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniakclass Container;
12b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
13b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaktemplate <typename T>
14b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniakclass Container<std::vector<T> *> {
15b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak public:
16b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Container(std::vector<T> *vec) : vec_(vec) {}
17b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Container(const Container &container) : vec_(container.vec_) {}
18b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
19b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void insert(std::size_t, const T &value) const {
20b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    vec_->push_back(value);
21b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
22b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
23b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  bool is_valid() const {
24b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return vec_ != NULL;
25b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
26b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
27b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak private:
28b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  std::vector<T> *vec_;
29b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
30b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  // Disallows assignment.
31b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Container &operator=(const Container &query);
32b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak};
33b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
34b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaktemplate <typename T>
35b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniakclass Container<T *> {
36b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak public:
37b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  explicit Container(T *ptr) : ptr_(ptr) {}
38b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Container(const Container &container) : ptr_(container.ptr_) {}
39b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
40b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void insert(std::size_t i, const T &value) {
41b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    ptr_[i] = value;
42b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
43b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
44b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  bool is_valid() const {
45b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return ptr_ != NULL;
46b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
47b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
48b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak private:
49b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  T *ptr_;
50b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
51b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  // Disallows assignment.
52b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Container &operator=(const Container &);
53b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak};
54b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
55b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaktemplate <typename T>
56b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniakinline Container<T *> MakeContainer(T *ptr) {
57b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  return Container<T *>(ptr);
58b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak}
59b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
60b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak}  // namespace marisa_alpha
61b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
62b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#endif  // MARISA_ALPHA_CONTAINER_H_
63