Skip to content

Commit

Permalink
Fix NCBC::consume(dropped) and KB::to_map (#101)
Browse files Browse the repository at this point in the history
* Fix NCBC::consume(dropped) and KB::to_map

* Fix test_karl_containers to use NCBC's 0-based indexing for inspect

* Update NCBC code output.
  • Loading branch information
dskyle committed Sep 28, 2018
1 parent 868a018 commit 70dba18
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 85 deletions.
4 changes: 2 additions & 2 deletions include/madara/knowledge/KnowledgeBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ namespace madara
void unlock (void);

/**
* Retrieves a knowledge value
* Atomically gets the current value of a variable (without any history).
* @param key knowledge location
* @param settings settings for referring to knowledge variables
* @return value at knowledge location
Expand All @@ -175,7 +175,7 @@ namespace madara
KnowledgeReferenceSettings (false));

/**
* Atomically returns the value of a variable.
* Atomically gets the current value of a variable (without any history).
* @param variable reference to a variable (@see get_ref)
* @param settings the settings for referring to variables
* @return the madara::knowledge::KnowledgeRecord::Integer value for the variable
Expand Down
6 changes: 3 additions & 3 deletions include/madara/knowledge/KnowledgeRecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -2010,7 +2010,7 @@ namespace madara
template<typename T, uint32_t Type, MemberType<T> Member,
bool Overwrite = false, typename... Args>
std::shared_ptr<const T> &emplace_val(Args&&... args) {
return emplace_shared_val<T, Type, Member> (std::move(
return emplace_shared_val<T, Type, Member, Overwrite> (std::move(
std::make_shared<const T> (
std::forward<Args>(args)...)));
}
Expand All @@ -2019,15 +2019,15 @@ namespace madara
bool Overwrite = false,
typename... Args>
std::shared_ptr<const std::vector<T>> &emplace_shared_vec(Args&&... args) {
return emplace_shared_val<std::vector<T>, Type, Member> (
return emplace_shared_val<std::vector<T>, Type, Member, Overwrite> (
std::forward<Args>(args)...);
}

template<typename T, uint32_t Type, MemberType<std::vector<T>> Member,
bool Overwrite = false,
typename... Args>
std::shared_ptr<const std::vector<T>> &emplace_vec(Args&&... args) {
return emplace_val<std::vector<T>, Type, Member> (
return emplace_val<std::vector<T>, Type, Member, Overwrite> (
std::forward<Args>(args)...);
}
};
Expand Down
2 changes: 1 addition & 1 deletion include/madara/knowledge/ThreadSafeContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1504,7 +1504,7 @@ ThreadSafeContext::to_map (
iters(get_prefix_range(prefix));

// RVO should avoid copying this map
return KnowledgeMap(deep_iterate(iters.first), deep_iterate(iters.second));
return KnowledgeMap(iters.first, iters.second);
}

KnowledgeMap
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,7 @@ template <typename T> void
NativeCircularBufferConsumer::consume (
T & value, size_t & dropped) const
{
ContextGuard context_guard (*context_);

if (remaining () > 0)
{
value = consume (dropped).to_any <T> ();
return;
}
value = consume (dropped).to_any <T> ();
}

template <typename T> void
Expand All @@ -121,12 +115,16 @@ NativeCircularBufferConsumer::peek_latest (size_t count) const

size_t newest_index = rec.get_history_newest_index ();

if (local_index_ + count > newest_index)
if (local_index_ + count > newest_index + 1)
{
count = newest_index - local_index_;
count = (newest_index + 1) - local_index_;
}

return rec.get_newest (count);
std::vector<KnowledgeRecord> ret_vec = rec.get_newest(count);

std::reverse(ret_vec.begin(),ret_vec.end());

return ret_vec;
}

inline madara::knowledge::KnowledgeRecord
Expand All @@ -138,7 +136,7 @@ NativeCircularBufferConsumer::peek_latest (void) const

size_t newest_index = rec.get_history_newest_index ();

if (local_index_ > newest_index)
if (local_index_ >= newest_index + 1)
{
return KnowledgeRecord ();
}
Expand Down Expand Up @@ -186,14 +184,18 @@ NativeCircularBufferConsumer::consume_latest (size_t count) const

std::vector <KnowledgeRecord> result;

if (local_index_ + count > newest_index)
if (local_index_ + count > newest_index + 1)
{
count = newest_index - local_index_;
count = (newest_index + 1) - local_index_;
}

local_index_ = newest_index + 1;

return rec.get_newest (count);
std::vector<KnowledgeRecord> ret_vec = rec.get_newest(count);

std::reverse(ret_vec.begin(),ret_vec.end());

return ret_vec;
}

inline madara::knowledge::KnowledgeRecord
Expand All @@ -205,14 +207,14 @@ NativeCircularBufferConsumer::consume_latest (void) const

size_t newest_index = rec.get_history_newest_index ();

if (local_index_ > newest_index)
KnowledgeRecord ret;

if (local_index_ < newest_index + 1)
{
++local_index_;
return KnowledgeRecord ();
ret = rec.get_newest ();
}

KnowledgeRecord ret = rec.get_newest ();
++local_index_;
local_index_ = newest_index + 1;

return ret;
}
Expand All @@ -228,30 +230,23 @@ NativeCircularBufferConsumer::consume_latest (size_t count, size_t & dropped) co

dropped = get_dropped ();

if (local_index_ + count > newest_index)
if (local_index_ + count > newest_index )
{
count = newest_index - local_index_;
}

local_index_ = newest_index + 1;
local_index_ = newest_index;

return rec.get_newest (count);
return rec.get_newest(count);
}


inline madara::knowledge::KnowledgeRecord
NativeCircularBufferConsumer::consume (void) const
{
ContextGuard context_guard (*context_);

size_t dropped = 0;

if (remaining () > 0)
{
return consume(dropped);
}

return KnowledgeRecord ();
return consume(dropped);
}


Expand All @@ -263,11 +258,9 @@ NativeCircularBufferConsumer::consume (

KnowledgeRecord &rec = *ref_.get_record_unsafe ();

size_t newest_index = rec.get_history_newest_index ();

size_t oldest_index = rec.get_history_oldest_index ();

if (local_index_ > newest_index)
if (remaining () == 0)
{
return KnowledgeRecord ();
}
Expand Down Expand Up @@ -410,7 +403,7 @@ NativeCircularBufferConsumer::inspect (
ret_vec.emplace_back (std::move(ret));
}
}

return ret_vec;
}

Expand Down
27 changes: 26 additions & 1 deletion tests/test_circular_buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@ void test_record_buffer()
TEST_EQ(rec.get_history(-2), 25);
TEST_EQ(rec.get_history(2), 19);

auto hist = rec.get_history();
TEST_EQ(hist.size(), 10UL);

test_history_vector<int>(rec.get_history(),
{{7, 24}, {2, 19}, {4, 21}, {5, 22}});
test_history_vector<int>(rec.get_newest(4),
Expand Down Expand Up @@ -239,8 +242,16 @@ void test_container()
TEST_EQ(buf.remaining(), 8UL);
TEST_EQ(buf.count(), 10UL);

int c = buf.get_record().get_history_oldest_index();
for (const auto &cur : buf.get_record().get_history()) {
std::cerr << c << ": " << cur << std::endl;
++c;
}
VAL(buf.get_index());

KnowledgeRecord rec;
rec = buf.inspect(3);
TEST_EQ(rec = buf.inspect(0), 23);
TEST_EQ(rec = buf.inspect(3), 26);

std::vector<KnowledgeRecord> v;
v = buf.inspect(2,3);
Expand Down Expand Up @@ -270,6 +281,20 @@ void test_container()
buf.consume_many(3,krvec);
test_consume_earliest<int>(krvec,{ {0,37}, {1,38}, {2,39} });

auto all = kb.to_map("");
TEST_EQ(all.size(), 1UL);

auto deep = kb.get_context().get_actual("test").deep_copy();
TEST_EQ(deep.to_integer(), 44);

key = "foo";
NativeCircularBufferConsumer buf2(key, kb);
kb.set_history_capacity(key, 10);

TEST_EQ(buf2.consume(dropped).exists(), false);

kb.set(key, 123);
TEST_EQ(buf2.consume(), 123);
}

int main (int, char **)
Expand Down

0 comments on commit 70dba18

Please sign in to comment.