list.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "list.h"
  2. #define HOLDER
  3. #define __TEMPLATE template<typename Type>
  4. #define TEMPLATE(rtype) __TEMPLATE rtype
  5. #define ADT List<Type>
  6. #define NODE ADT::Node
  7. #define ITERATOR ADT::iterator
  8. // #pragma region List<Type>::iterator
  9. TEMPLATE(HOLDER) ITERATOR::iterator(Node* ptr) {
  10. _ptr = ptr;
  11. }
  12. TEMPLATE(typename ITERATOR&) ITERATOR::operator++() {
  13. _ptr = _ptr->_next;
  14. return *this;
  15. }
  16. TEMPLATE(typename ITERATOR&) ITERATOR::operator--() {
  17. _ptr = _ptr->_prev;
  18. return *this;
  19. }
  20. TEMPLATE(bool) ITERATOR::operator== (const ITERATOR& it) {
  21. // TBD 其它信息比较
  22. return _ptr == it._ptr;
  23. }
  24. TEMPLATE(bool) ITERATOR::operator!= (const ITERATOR& it) {
  25. return !(*this == it);
  26. }
  27. // #pragma endregion
  28. // #pragma region List<Type>
  29. TEMPLATE(HOLDER) ADT::List() : dummy(&dummy, &dummy) {};
  30. TEMPLATE(typename ITERATOR) ADT::begin() { return ADT::iterator(head->_next); }
  31. TEMPLATE(typename ITERATOR) ADT::end() { return ADT::iterator(head); }
  32. TEMPLATE(typename ITERATOR) ADT::rbegin() { return ADT::iterator(tail->_prev); }
  33. TEMPLATE(typename ITERATOR) ADT::rend() { return ADT::iterator(tail); }
  34. TEMPLATE(typename ITERATOR&) ADT::operator[] (int index) {
  35. Node* curr = head;
  36. for (; index >= 0; --index) {
  37. if (curr == nullptr) {
  38. return end();
  39. }
  40. curr = curr->next;
  41. }
  42. return iterator(curr);
  43. }
  44. TEMPLATE(ADT&) ADT::operator+= (Type& value) {
  45. Node* node = new Node(value, tail->_prev, tail);
  46. tail->_prev->_next = node;
  47. tail->_prev = node;
  48. return *this;
  49. }
  50. TEMPLATE(typename ITERATOR) ADT::append(Type& value) {
  51. Node* node = new Node(value, tail->_prev, tail);
  52. tail->_prev->_next = node;
  53. tail->_prev = node;
  54. return iterator(node);
  55. }
  56. // #pragma endregion
  57. #undef HOLDER
  58. #undef __TEMPLATE
  59. #undef TEMPLATE
  60. #undef ADT
  61. #undef NODE
  62. #undef ITERATOR