tire.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "tire.h"
  2. #define HOLDER
  3. #define __TEMPLATE template<typename Type, typename Container>
  4. #define TEMPLATE(rtype) __TEMPLATE rtype
  5. #define ADT Tire<Type, Container>
  6. #define NODE ADT::Node
  7. #define ITERATOR ADT::iterator
  8. // #pragma region Tire<Type>::Node
  9. TEMPLATE(HOLDER) NODE::Node() {
  10. }
  11. TEMPLATE(HOLDER) NODE::Node(Type& value) {
  12. _value = typename Container::Node(value);
  13. }
  14. // #pragma endregion
  15. // #pragma region Tire<Type>
  16. TEMPLATE(HOLDER) ADT::Tire() {
  17. }
  18. TEMPLATE(typename ITERATOR) ADT::find(const std::string& key) {
  19. Node* curr = &_root;
  20. Node* next = nullptr;
  21. for (char ch : key) {
  22. next = curr[ch];
  23. if (next == nullptr) {
  24. }
  25. curr = next;
  26. }
  27. return curr->is_word() ? curr : nullptr;
  28. }
  29. TEMPLATE(Type&) ADT::operator[](const std::string& key) {
  30. return *find(key);
  31. }
  32. TEMPLATE(typename ITERATOR) ADT::insert(const std::string& key, Type& value) {
  33. Node* curr = &_root;
  34. Node* next = nullptr;
  35. for (const char& ch : key) {
  36. next = curr->_next[(int)ch];
  37. if (next != nullptr) {
  38. curr = next;
  39. continue;
  40. }
  41. curr = curr->_next[(int)ch] = new Node();
  42. }
  43. iterator it = _container.append(value);
  44. curr->_value = &it;
  45. return it;
  46. }
  47. TEMPLATE(typename ITERATOR) ADT::erase(const std::string& key) {
  48. return false; // TBD
  49. }
  50. TEMPLATE(typename ITERATOR) ADT::begin() { return _container.begin(); }
  51. TEMPLATE(typename ITERATOR) ADT::end() { return _container.end(); }
  52. TEMPLATE(typename ITERATOR) ADT::rbegin() { return _container.rbegin(); }
  53. TEMPLATE(typename ITERATOR) ADT::rend() { return _container.rend(); }
  54. // #pragma endregion
  55. #undef HOLDER
  56. #undef __TEMPLATE
  57. #undef TEMPLATE
  58. #undef ADT
  59. #undef NODE
  60. #undef ITERATOR