| #include "route_traceback.h" |
| #include "route_common.h" |
| #include "vpr_types.h" //For t_trace |
| |
| t_traceback::t_traceback(const t_traceback& other) { |
| VTR_ASSERT((other.head == nullptr && other.tail == nullptr) || (other.head && other.tail && other.tail->next == nullptr)); |
| |
| //Deep-copy of traceback |
| t_trace* prev = nullptr; |
| for (t_trace* other_curr = other.head; other_curr; other_curr = other_curr->next) { |
| //VTR_LOG("Copying trace %p node: %d switch: %d\n", other_curr, other_curr->index, other_curr->iswitch); |
| t_trace* curr = alloc_trace_data(); |
| |
| curr->index = other_curr->index; |
| curr->iswitch = other_curr->iswitch; |
| |
| if (prev) { |
| prev->next = curr; |
| } else { |
| head = curr; |
| } |
| prev = curr; |
| } |
| |
| //We may have gotten the last t_trace element from a free list, |
| //make sure it's next ptr gets set to null |
| if (prev) { |
| prev->next = nullptr; |
| } |
| |
| tail = prev; |
| } |
| |
| t_traceback::~t_traceback() { |
| free_traceback(head); |
| } |
| |
| t_traceback::t_traceback(t_traceback&& other) |
| : t_traceback() { |
| //Copy-swap |
| swap(*this, other); |
| } |
| |
| t_traceback t_traceback::operator=(t_traceback other) { |
| //Copy-swap |
| swap(*this, other); |
| return *this; |
| } |
| |
| void swap(t_traceback& first, t_traceback& second) { |
| using std::swap; |
| |
| swap(first.head, second.head); |
| swap(first.tail, second.tail); |
| } |