From 2e226879ef8eee63b69710f814b11c07bc288507 Mon Sep 17 00:00:00 2001 From: Hannes Kuchelmeister Date: Sun, 10 Jan 2021 21:32:21 +0100 Subject: [PATCH] implement count --- Assignment_3/lib/TreiberStack.cpp | 10 ++++++++-- Assignment_3/lib/TreiberStack.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Assignment_3/lib/TreiberStack.cpp b/Assignment_3/lib/TreiberStack.cpp index 8715fef..598d6cf 100644 --- a/Assignment_3/lib/TreiberStack.cpp +++ b/Assignment_3/lib/TreiberStack.cpp @@ -4,7 +4,9 @@ #include "ADT_Stack.h" -TreiberStack::TreiberStack(ADTOperationQueue * queue) : Stack(queue) { } +TreiberStack::TreiberStack(ADTOperationQueue * queue) : Stack(queue) { + count.store(0); +} void TreiberStack::push(int element) { Node * n; @@ -15,6 +17,7 @@ void TreiberStack::push(int element) { n->next = t; if (top.compare_exchange_weak(t, n)) { op_queue->enqueue(create_operation(methodname::push, element)); + count.fetch_add(1); return; } } @@ -31,10 +34,13 @@ int TreiberStack::pop() { } else if (top.compare_exchange_weak(t, t->next)) { int data = t->get_data(); op_queue->enqueue(create_operation(methodname::pop, data)); + count.fetch_add(-1); return data; } } } int TreiberStack::size() { - return 0; + int c = count.load(std::memory_order_relaxed); + op_queue->enqueue(create_operation(methodname::size, c)); + return c; } \ No newline at end of file diff --git a/Assignment_3/lib/TreiberStack.h b/Assignment_3/lib/TreiberStack.h index 376c12b..5abf6dc 100644 --- a/Assignment_3/lib/TreiberStack.h +++ b/Assignment_3/lib/TreiberStack.h @@ -5,6 +5,7 @@ class TreiberStack:public Stack{ private: + std::atomic count; std::atomic top; public: TreiberStack(ADTOperationQueue * queue);