#ifndef MARISA_ALPHA_QUERY_H_
#define MARISA_ALPHA_QUERY_H_

#include <string>

#include "base.h"

namespace marisa_alpha {

class Query {
 public:
  Query(const char *ptr, std::size_t length) : ptr_(ptr), length_(length) {}
  Query(const Query &query) : ptr_(query.ptr_), length_(query.length_) {}

  void insert(std::string *str) const {
    str->insert(0, ptr_, length_);
  }

  UInt8 operator[](std::size_t i) const {
    MARISA_ALPHA_DEBUG_IF(i >= length_, MARISA_ALPHA_PARAM_ERROR);
    return ptr_[i];
  }
  bool ends_at(std::size_t i) const {
    MARISA_ALPHA_DEBUG_IF(i > length_, MARISA_ALPHA_PARAM_ERROR);
    return i == length_;
  }

 private:
  const char *ptr_;
  std::size_t length_;

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

class CQuery {
 public:
  explicit CQuery(const char *str) : str_(str) {}
  CQuery(const CQuery &query) : str_(query.str_) {}

  void insert(std::string *str) const {
    str->insert(0, str_);
  }

  UInt8 operator[](std::size_t i) const {
    return str_[i];
  }
  bool ends_at(std::size_t i) const {
    return str_[i] == '\0';
  }

 private:
  const char *str_;

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

}  // namespace marisa_alpha

#endif  // MARISA_ALPHA_QUERY_H_