Skip to content

Commit

Permalink
Add Queue Interface & Standard Queue Implementation (#10)
Browse files Browse the repository at this point in the history
* Add queue interface to the container datastructures
* Add standard queue implementation to the container datastructures
  • Loading branch information
franziska-wegner committed Dec 7, 2023
1 parent f351521 commit 95c64b5
Show file tree
Hide file tree
Showing 2 changed files with 173 additions and 0 deletions.
74 changes: 74 additions & 0 deletions include/DataStructures/Container/Queues/Queue.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Queue.hpp
*
* Created on: Nov 18, 2018
* Author: Franziska Wegner
*/

#ifndef EGOA__DATA_STRUCTURES__CONTAINER__QUEUE__QUEUE_HPP
#define EGOA__DATA_STRUCTURES__CONTAINER__QUEUE__QUEUE_HPP

#include "Auxiliary/Types.hpp"

namespace egoa {

template<typename Type>
class Queue {
using TElement = Type;
public:
//@todo is Compare necessary? For PQ okay but standard queue?
#pragma mark CONSTRUCTORS_AND_DESTRUCTORS
Queue(){}

template<typename Compare, class Container>
Queue ( Compare const & compare ){}

template<class Container>
Queue ( Container const & container ){}

template<typename Compare, class Container>
Queue ( Compare const & compare, Container const & container ){}

virtual ~Queue() {}

#pragma mark LOOPS
template<bool IsParallel, typename FUNCTION>
inline void for_all_elements ( FUNCTION function ) {}

template<bool IsParallel, typename FUNCTION>
inline void for_all_elements ( FUNCTION function ) const {}

template<typename FUNCTION>
inline void breakable_for_all_elements ( FUNCTION function ) {}

template<typename FUNCTION>
inline void breakable_for_all_elements ( FUNCTION function ) const {}

#pragma mark ELEMENT_ACCESS
///@Name Element Access
///@{
virtual inline TElement const & Top () const = 0;
///@}

///@Name Modifiers
///@{
#pragma mark ADD_ELEMENTS
virtual inline void Push ( TElement const & element ) = 0;
virtual inline void Push ( TElement && element ) = 0;
#pragma mark MODIFIERS
virtual inline void Pop () = 0;
virtual inline void Clear () = 0;
inline void Swap ( Queue & rhs) {};
///@}

#pragma mark CAPACITY
///@Name Capacity
///@{
virtual inline bool Empty () const = 0;
virtual inline Types::count Size () const = 0;
///@}
};

} // namespace egoa

#endif // EGOA__DATA_STRUCTURES__CONTAINER__QUEUE__QUEUE_HPP
99 changes: 99 additions & 0 deletions include/DataStructures/Container/Queues/StdQueue.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/*
* StdQueue.hpp
*
* Created on: Feb 17, 2019
* Author: Franziska Wegner
*/

#ifndef EGOA__DATA_STRUCTURES__CONTAINER__QUEUE__STD_FIFO_QUEUE_HPP
#define EGOA__DATA_STRUCTURES__CONTAINER__QUEUE__STD_FIFO_QUEUE_HPP

#include <queue>

#include "Auxiliary/Types.hpp"
#include "Exceptions/Assertions.hpp"

namespace egoa {

//@todo Emplace, Comments
// this queue does not implement loops
template<typename ElementType>
class StdQueue {
public:
// Type aliasing
using TElement = ElementType;
public:
#pragma mark CONSTRUCTORS_AND_DESTRUCTORS

StdQueue ()
: queue_(){}

virtual ~StdQueue() {}

#pragma mark ELEMENT_ACCESS
///@Name Element Access
///@{
virtual inline TElement const & Top () const {
USAGE_ASSERT ( Size() > 0 );
return queue_.front();
}
///@}

///@Name Modifiers
///@{
#pragma mark ADD_ELEMENTS
virtual inline void Push ( TElement const & element ) {
queue_.push ( element );
}

virtual inline void Push ( TElement && element ) {
queue_.push ( element );
}

//@todo
virtual inline void Emplace ( TElement const & element ) {
queue_.emplace ( element );
}
#pragma mark MODIFIERS
virtual inline void Pop () {
USAGE_ASSERT ( Size() > 0 );
queue_.pop();
}

virtual inline TElement DeleteTop() {
USAGE_ASSERT ( Size() > 0 );

TElement top = std::move( Top() );
Pop();
return top;
}

virtual inline void Clear () {
std::queue<TElement> empty;
std::swap( queue_, empty );
}

virtual inline void Swap ( StdQueue & rhs ) {
queue_.swap( rhs.queue_ );
}
///@}

#pragma mark CAPACITY
///@Name Capacity
///@{
virtual inline bool Empty () const {
return queue_.empty();
}

virtual inline Types::count Size () const {
return queue_.size();
}
///@}
#pragma mark MEMBERS
private:
std::queue<TElement> queue_;
};

} // namespace egoa

#endif // EGOA__DATA_STRUCTURES__CONTAINER__QUEUE__STD_FIFO_QUEUE_HPP

0 comments on commit 95c64b5

Please sign in to comment.