#ifndef MARISA_ALPHA_CONTAINER_H_
#define MARISA_ALPHA_CONTAINER_H_

#include <vector>

#include "base.h"

namespace marisa_alpha {

template <typename T>
class Container;

template <typename T>
class Container<std::vector<T> *> {
 public:
  Container(std::vector<T> *vec) : vec_(vec) {}
  Container(const Container &container) : vec_(container.vec_) {}

  void insert(std::size_t, const T &value) const {
    vec_->push_back(value);
  }

  bool is_valid() const {
    return vec_ != NULL;
  }

 private:
  std::vector<T> *vec_;

  // Disallows assignment.
  Container &operator=(const Container &query);
};

template <typename T>
class Container<T *> {
 public:
  explicit Container(T *ptr) : ptr_(ptr) {}
  Container(const Container &container) : ptr_(container.ptr_) {}

  void insert(std::size_t i, const T &value) {
    ptr_[i] = value;
  }

  bool is_valid() const {
    return ptr_ != NULL;
  }

 private:
  T *ptr_;

  // Disallows assignment.
  Container &operator=(const Container &);
};

template <typename T>
inline Container<T *> MakeContainer(T *ptr) {
  return Container<T *>(ptr);
}

}  // namespace marisa_alpha

#endif  // MARISA_ALPHA_CONTAINER_H_