1f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#ifndef MARISA_QUERY_H_
2f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#define MARISA_QUERY_H_
3f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
4f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#include <string>
5f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
6f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#include "base.h"
7f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
8f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamathnamespace marisa {
9f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
10f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamathclass Query {
11f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath public:
12f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  Query(const char *ptr, std::size_t length) : ptr_(ptr), length_(length) {}
13f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  Query(const Query &query) : ptr_(query.ptr_), length_(query.length_) {}
14f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
15f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  void insert(std::string *str) const {
16f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    str->insert(0, ptr_, length_);
17f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
18f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
19f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  UInt8 operator[](std::size_t i) const {
20f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    MARISA_DEBUG_IF(i >= length_, MARISA_PARAM_ERROR);
21f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    return ptr_[i];
22f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
23f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  bool ends_at(std::size_t i) const {
24f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    MARISA_DEBUG_IF(i > length_, MARISA_PARAM_ERROR);
25f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    return i == length_;
26f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
27f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
28f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath private:
29f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  const char *ptr_;
30f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  std::size_t length_;
31f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
32f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  // Disallows assignment.
33f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  Query &operator=(const Query &query);
34f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath};
35f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
36f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamathclass CQuery {
37f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath public:
38f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  explicit CQuery(const char *str) : str_(str) {}
39f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  CQuery(const CQuery &query) : str_(query.str_) {}
40f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
41f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  void insert(std::string *str) const {
42f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    str->insert(0, str_);
43f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
44f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
45f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  UInt8 operator[](std::size_t i) const {
46f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    return str_[i];
47f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
48f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  bool ends_at(std::size_t i) const {
49f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath    return str_[i] == '\0';
50f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  }
51f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
52f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath private:
53f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  const char *str_;
54f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
55f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  // Disallows assignment.
56f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath  CQuery &operator=(const CQuery &);
57f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath};
58f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
59f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath}  // namespace marisa
60f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath
61f163f6985a63328d07e3de249ad3daf4a0c67d8aNarayan Kamath#endif  // MARISA_QUERY_H_
62