Skip to content

Commit

Permalink
fixed some consts and stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
Kyle Gendreau authored and Kyle Gendreau committed Jul 1, 2021
1 parent bd44957 commit 40a26f9
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 32 deletions.
17 changes: 9 additions & 8 deletions include/SimpleTrieTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <string>
#include <stack>
#include "Iterator.h"
#include "DefaultParameters.h"

/**
* -1 if cur node's key is equivalent to input,
Expand All @@ -20,7 +21,7 @@
* -2 if not found
*/
template <typename K, typename T, uint32_t S>
class Awful_Indexer {
class BinTrie_Indexer {
public:
// called when not inserting
int32_t operator()(K& input, const Node<K,T,S>* node) {
Expand Down Expand Up @@ -52,9 +53,9 @@ class SimpleTrieTemplate;
*
*/
template<typename K, typename T, uint32_t S, typename Indexer>
class Awful_Eraser {
class BinTrie_Eraser {
public:
void operator()(Node<K,T,S>* &ancestor, Node<K,T,S>* &descendant, SimpleTrieTemplate<K,T,S,Indexer,Awful_Eraser<K,T,S,Indexer>> &trie) {
void operator()(Node<K,T,S>* &ancestor, Node<K,T,S>* &descendant, SimpleTrieTemplate<K,T,S,Indexer,BinTrie_Eraser<K,T,S,Indexer>> &trie) {

std::stack<std::pair<K,T>> stk;
mergeStack(stk, getStack(descendant->child_.at(0).get()));
Expand Down Expand Up @@ -106,7 +107,7 @@ class Awful_Eraser {
}
};

template <typename K, typename T, uint32_t S = 2, typename Indexer = Awful_Indexer<K,T,S>, typename Eraser = Awful_Eraser<K,T,S,Indexer>>
template <typename K, typename T, uint32_t S = 2, typename Indexer = BinTrie_Indexer<K,T,S>, typename Eraser = BinTrie_Eraser<K,T,S,Indexer>>
class SimpleTrieTemplate {
public:

Expand Down Expand Up @@ -185,7 +186,7 @@ class SimpleTrieTemplate {
* swaps the contents
* @param rhs - the container to exchange the contents with
*/
void swap(SimpleTrieTemplate& rhs);
void swap(SimpleTrieTemplate& rhs) noexcept;

//////////////////////////////////////////////////////
//// LOOKUPS
Expand Down Expand Up @@ -246,10 +247,10 @@ class SimpleTrieTemplate {
//////////////////////////////////////////////////////
//// PRIVATE HELPER METHODS

std::pair<bool, iterator> scout_helper(key_type& key, const Node* curNode);
static std::pair<bool, iterator> scout_helper(key_type& key, const Node* curNode, key_indexer& indexer);

iterator insert_helper(Node* &curNode, key_type& article, mapped_type& value);
iterator insert_helper(Node* &&curNode, key_type& article, mapped_type& value);
static iterator insert_helper(Node* &curNode, key_type& article, mapped_type& value, key_indexer& indexer);
static iterator insert_helper(Node* &&curNode, key_type& article, mapped_type& value, key_indexer& indexer);

void checkIterPtr_helper(Node* &ptr);

Expand Down
65 changes: 41 additions & 24 deletions src/SimpleTrieTemplate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,22 +69,35 @@ Iterator<K,T,S> SimpleTrieTemplate<K, T, S, indexer_, eraser_>::insertOrAssign(s
template<typename K, typename T, uint32_t S, typename indexer_, typename eraser_>
Iterator<K,T,S>
SimpleTrieTemplate<K, T, S, indexer_, eraser_>::insertOrAssign(key_type article, mapped_type &value, Node* ancestor) {
checkIterPtr_helper(ancestor);

uint32_t cnt(size());
if (contains(article))
--cnt;
checkIterPtr_helper(ancestor); // ensure ptr not null, else assign to begin() node
uint32_t cnt(size()); // obtain original size

auto it(begin()); // will be assigned later
Node* ptr(nullptr); // will be assigned later

auto it(begin());
// if it's empty, then we insert at root's first child. There should ALWAYS be a root node, it holds junk values.
if (empty()) { //ie if curNode == end().get() && curNode == begin().get()
assert(ancestor == root_);
Node* ptr(ancestor->child_.at(0).get());
it = insert_helper(ptr,article,value);
it = insert_helper(ptr,article,value,indexer_);

// CHANGES ARE NOW PERMANENT -- exception safe
ancestor->child_.at(0).reset(ptr);
ptr->parent_ = ancestor;
}
else
it = insert_helper(ancestor, article, value);

// else we insert the input directly at the node, not after!
else {
if (contains(article)) // if already present then count shouldn't change
--cnt;
ptr = new Node(*ancestor);
it = insert_helper(ptr, article, value, indexer_);

// CHANGES ARE NOW PERMANENT -- exception safe
ptr->parent_ = ancestor->parent_;
ancestor->parent_->child_.at(iterator::findChildsIndex(*ancestor->parent_, *ancestor)).reset(ptr);
ancestor = ptr;
}

numberArticles_ = ++cnt;
return it;
Expand All @@ -109,13 +122,15 @@ void SimpleTrieTemplate<K, T, S, indexer_, eraser_>::erase(Node* &descendant,Nod
if (!empty()) {
uint32_t curSize(size());
checkIterPtr_helper(ancestor);

// CHANGES ARE NOW PERMANENT -- todo NOT EXCEPTION SAFE
eraser_(ancestor, descendant, *this);
numberArticles_ = --curSize;
}
}

template<typename K, typename T, uint32_t S, typename indexer_, typename eraser_>
void SimpleTrieTemplate<K, T, S, indexer_, eraser_>::swap(SimpleTrieTemplate &rhs) {
void SimpleTrieTemplate<K, T, S, indexer_, eraser_>::swap(SimpleTrieTemplate &rhs) noexcept {
if (this != &rhs) {
// numberArticles_
std::swap(numberArticles_,rhs.numberArticles_);
Expand All @@ -140,11 +155,13 @@ Iterator<K,T,S> SimpleTrieTemplate<K, T, S, indexer_, eraser_>::find(key_type ar
template<typename K, typename T, uint32_t S, typename indexer_, typename eraser_>
std::pair<bool, Iterator<K,T,S>>
SimpleTrieTemplate<K, T, S, indexer_, eraser_>::scout(key_type article,Node* ancestor) {
if (empty()) {
if (empty())
return std::pair<bool, iterator>(false,begin());
}

checkIterPtr_helper(ancestor);
return scout_helper(article, ancestor);

// assume scout operation doesn't edit nodes in trie
return scout_helper(article, ancestor, indexer_);
}

template<typename K, typename T, uint32_t S, typename indexer_, typename eraser_>
Expand Down Expand Up @@ -181,36 +198,37 @@ Iterator<K,T,S> SimpleTrieTemplate<K, T, S, indexer_, eraser_>::end() {

template<typename K, typename T, uint32_t S, typename indexer_, typename eraser_>
std::pair<bool, Iterator<K,T,S>>
SimpleTrieTemplate<K, T, S, indexer_, eraser_>::scout_helper(key_type &key, const Node* curNode) {
int32_t index(indexer_(key,curNode));
SimpleTrieTemplate<K, T, S, indexer_, eraser_>::scout_helper(key_type &key, const Node* curNode, key_indexer& indexer) {

int32_t index(indexer(key,curNode));
if (index > -1 && index < S) {
if (curNode->child_.at(index).get() == nullptr)
return std::pair<bool,iterator>(false,iterator(const_cast<Node&>(*curNode),-1));
else
return scout_helper(key, curNode->child_.at(index).get());
return scout_helper(key, curNode->child_.at(index).get(), indexer);
}
else if (index == -1) {
return std::pair<bool,iterator>(true,iterator(const_cast<Node&>(*curNode),-1));
}
else if (index == -2) {
return std::pair<bool,iterator>(false,iterator(const_cast<Node&>(*curNode),-1));
return std::pair<bool,iterator>(false,iterator(const_cast<Node&>(*curNode->parent_),-1));
}
// else an invalid index was returned
throw std::domain_error("indexer_ returned value outside of [-1," + std::to_string(S) + "]: " + std::to_string(index) + "\n");
}

template<typename K, typename T, uint32_t S, typename indexer_, typename eraser_>
Iterator<K,T,S>
SimpleTrieTemplate<K, T, S, indexer_, eraser_>::insert_helper(Node* &curNode, key_type &key, mapped_type &value) {
int16_t index(indexer_(key,curNode));
SimpleTrieTemplate<K, T, S, indexer_, eraser_>::insert_helper(Node* &curNode, key_type &key, mapped_type &value, key_indexer& indexer) {
int16_t index(indexer(key,curNode));
if (index == -1) {
curNode->value_ = value;
return iterator(*curNode, -1);
}
//todo this forces all relative modification/indexing to not allow access to parents
else if (index > -1 && index < S) {
auto ptr(curNode->child_.at(index).get());
auto it(insert_helper(ptr, key, value));
auto it(insert_helper(ptr, key, value, indexer));
if (curNode->child_.at(index).get() == nullptr) {
curNode->child_.at(index).reset(ptr);
curNode->child_.at(index)->parent_ = curNode;
Expand All @@ -223,15 +241,14 @@ SimpleTrieTemplate<K, T, S, indexer_, eraser_>::insert_helper(Node* &curNode, ke

template<typename K, typename T, uint32_t S, typename Indexer, typename Eraser>
Iterator<K,T,S>
SimpleTrieTemplate<K, T, S, Indexer, Eraser>::insert_helper(Node *&&curNode, key_type &article, mapped_type &value) {
return insert_helper(curNode, article, value);
SimpleTrieTemplate<K, T, S, Indexer, Eraser>::insert_helper(Node *&&curNode, key_type &article, mapped_type &value, key_indexer& indexer) {
return insert_helper(curNode, article, value, indexer);
}

template<typename K, typename T, uint32_t S, typename indexer_, typename eraser_>
void SimpleTrieTemplate<K, T, S, indexer_, eraser_>::checkIterPtr_helper(Node* &ptr) {
if (ptr == nullptr) {
if (ptr == nullptr)
ptr = begin().get();
}
}

#endif // SIMPLETRIETEMPLATE_SIMPLETRIETEMPLATE_CPP

0 comments on commit 40a26f9

Please sign in to comment.