1
0

list.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "list.h"
  2. // #pragma region list<T>::iterator
  3. template<typename T>
  4. list<T>::iterator::iterator(list_node* ptr) {
  5. _ptr = ptr;
  6. }
  7. template<typename T>
  8. typename::list<T>::iterator& list<T>::iterator::operator++() {
  9. _ptr = _ptr->_next;
  10. return *this;
  11. }
  12. template<typename T>
  13. typename::list<T>::iterator& list<T>::iterator::operator--() {
  14. _ptr = _ptr->_prev;
  15. return *this;
  16. }
  17. template<typename T>
  18. bool list<T>::iterator::operator== (const list<T>::iterator& it) {
  19. // TBD 其它信息比较
  20. return _ptr == it._ptr;
  21. }
  22. template<typename T>
  23. bool list<T>::iterator::operator!= (const list<T>::iterator& it) {
  24. return !(*this == it);
  25. }
  26. // #pragma endregion
  27. // #pragma region list<T>
  28. template<typename T>
  29. list<T>::list() : dummy(&dummy, &dummy) {};
  30. template<typename T>
  31. typename::list<T>::iterator list<T>::begin() { return list<T>::iterator(head->_next); }
  32. template<typename T>
  33. typename::list<T>::iterator list<T>::end() { return list<T>::iterator(head); }
  34. template<typename T>
  35. typename::list<T>::iterator list<T>::rbegin() { return list<T>::iterator(tail->_prev); }
  36. template<typename T>
  37. typename::list<T>::iterator list<T>::rend() { return list<T>::iterator(tail); }
  38. template<typename T>
  39. typename::list<T>::iterator& list<T>::operator[] (int index) {
  40. list_node* curr = head;
  41. for (; index >= 0; --index) {
  42. if (curr == nullptr) {
  43. return end();
  44. }
  45. curr = curr->next;
  46. }
  47. return iterator(curr);
  48. }
  49. template<typename T>
  50. typename::list<T>& list<T>::operator+= (const T& value) {
  51. list_node* node = new list_node(value, tail->_prev, tail);
  52. tail->_prev->_next = node;
  53. tail->_prev = node;
  54. return *this;
  55. }
  56. // #pragma endregion
  57. #ifdef __DEBUG_LIST__
  58. struct Test {
  59. int num;
  60. std::string str;
  61. Test() {}
  62. Test(const Test& t) {
  63. *this = t;
  64. }
  65. };
  66. int main() {
  67. list<Test> l1;
  68. for (int i = 0; i < 255; ++i) {
  69. Test t;
  70. t.str = std::to_string(i + 1);
  71. t.num = i + 1;
  72. l1 += t;
  73. }
  74. for (auto item : l1) {
  75. std::cout << "str:" << item.str << ". num:" << item.num << ". " << std::endl;
  76. }
  77. return 0;
  78. }
  79. #endif