tire.cpp 1.7 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 (const char& ch : key) {
  22. next = curr->_next[(const int)ch];
  23. if (next == nullptr) {
  24. return end();
  25. }
  26. curr = next;
  27. }
  28. return curr->_value == nullptr ? end() : iterator(curr->_value);
  29. }
  30. TEMPLATE(Type&) ADT::operator[](const std::string& key) {
  31. return *find(key);
  32. }
  33. TEMPLATE(typename ITERATOR) ADT::insert(const std::string& key, Type& value) {
  34. Node* curr = &_root;
  35. Node* next = nullptr;
  36. for (const char& ch : key) {
  37. next = curr->_next[(const int)ch];
  38. if (next != nullptr) {
  39. curr = next;
  40. continue;
  41. }
  42. curr = curr->_next[(int)ch] = new Node();
  43. }
  44. iterator it = _container.append(value);
  45. curr->_value = &it;
  46. return it;
  47. }
  48. TEMPLATE(typename ITERATOR) ADT::erase(const std::string& key) {
  49. return false; // TBD
  50. }
  51. TEMPLATE(typename ITERATOR) ADT::begin() { return _container.begin(); }
  52. TEMPLATE(typename ITERATOR) ADT::end() { return _container.end(); }
  53. TEMPLATE(typename ITERATOR) ADT::rbegin() { return _container.rbegin(); }
  54. TEMPLATE(typename ITERATOR) ADT::rend() { return _container.rend(); }
  55. // #pragma endregion
  56. #undef HOLDER
  57. #undef __TEMPLATE
  58. #undef TEMPLATE
  59. #undef ADT
  60. #undef NODE
  61. #undef ITERATOR