tire.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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() {
  12. for (int i = 0; i < TIRE_NODE_NUMBER; ++i) {
  13. if (_next[i] != nullptr) {
  14. delete _next[i];
  15. _next[i] = nullptr;
  16. }
  17. }
  18. _value = nullptr;
  19. }
  20. // #pragma endregion
  21. // #pragma region Tire<Type>
  22. TEMPLATE(HOLDER) ADT::Tire() {
  23. }
  24. TEMPLATE(HOLDER) ADT::~Tire() {
  25. for (int i = 0; i < TIRE_NODE_NUMBER; ++i) {
  26. delete _root._next[i];
  27. _root._next[i] = nullptr;
  28. }
  29. _root._value = nullptr;
  30. }
  31. TEMPLATE(typename ITERATOR) ADT::find(const std::string& key) {
  32. Node* curr = &_root;
  33. Node* next = nullptr;
  34. for (const char& ch : key) {
  35. next = curr->_next[INDEX(ch)];
  36. if (next == nullptr) {
  37. return end();
  38. }
  39. curr = next;
  40. }
  41. return curr->_value == nullptr ? end() : iterator(curr->_value);
  42. }
  43. TEMPLATE(Type&) ADT::operator[](const std::string& key) {
  44. return *find(key);
  45. }
  46. TEMPLATE(typename ITERATOR) ADT::insert(const std::string& key, Type& value) {
  47. Node* curr = &_root;
  48. Node* next = nullptr;
  49. for (const char& ch : key) {
  50. next = curr->_next[INDEX(ch)];
  51. if (next != nullptr) {
  52. curr = next;
  53. continue;
  54. }
  55. curr = curr->_next[(int)ch] = new Node();
  56. }
  57. iterator it = _container.append(value);
  58. curr->_value = &it;
  59. return it;
  60. }
  61. TEMPLATE(typename ITERATOR) ADT::erase(const std::string& key) {
  62. return false; // TBD
  63. }
  64. TEMPLATE(typename ITERATOR) ADT::begin() { return _container.begin(); }
  65. TEMPLATE(typename ITERATOR) ADT::end() { return _container.end(); }
  66. TEMPLATE(typename ITERATOR) ADT::rbegin() { return _container.rbegin(); }
  67. TEMPLATE(typename ITERATOR) ADT::rend() { return _container.rend(); }
  68. // #pragma endregion
  69. #undef HOLDER
  70. #undef __TEMPLATE
  71. #undef TEMPLATE
  72. #undef ADT
  73. #undef NODE
  74. #undef ITERATOR