3 #ifndef _KNOWLEDGE_RECORD_INL_ 4 #define _KNOWLEDGE_RECORD_INL_ 30 typename std::enable_if<std::is_integral<T>::value,
void*>
::type>
33 : logger_ (&
logger), int_value_ ((
Integer)value), type_ (INTEGER)
52 std::shared_ptr<std::vector<Integer>> value,
60 typename std::enable_if<std::is_floating_point<T>::value,
void*>
::type>
68 const std::vector <double> & value,
76 std::vector <double> && value,
84 std::shared_ptr<std::vector<double>> value,
106 std::shared_ptr<std::string> value,
121 std::shared_ptr<std::vector<unsigned char>> value,
163 if (rhs.type_ ==
EMPTY)
169 new (&
int_array_) std::shared_ptr<std::vector<Integer>>(std::move(rhs.int_array_));
170 else if (rhs.type_ ==
DOUBLE)
173 new (&
double_array_) std::shared_ptr<std::vector<double>>(std::move(rhs.double_array_));
174 else if (rhs.is_string_type ())
175 new (&
str_value_) std::shared_ptr<std::string>(std::move(rhs.str_value_));
176 else if (rhs.is_binary_file_type ())
177 new (&
file_value_) std::shared_ptr<std::vector<unsigned char>>(std::move(rhs.file_value_));
231 if (rhs.type_ ==
EMPTY)
244 new (&
int_array_) std::shared_ptr<std::vector<Integer>>(std::move(rhs.int_array_));
245 else if (rhs.type_ ==
DOUBLE)
248 new (&
double_array_) std::shared_ptr<std::vector<double>>(std::move(rhs.double_array_));
249 else if (rhs.is_string_type ())
250 new (&
str_value_) std::shared_ptr<std::string>(std::move(rhs.str_value_));
251 else if (rhs.is_binary_file_type ())
252 new (&
file_value_) std::shared_ptr<std::vector<unsigned char>>(std::move(rhs.file_value_));
261 typename std::enable_if<std::is_integral<T>::value,
void*>
::type>
280 typename std::enable_if<std::is_floating_point<T>::value,
void*>
::type>
308 return to_string ().compare (value) == 0;
315 return !(*
this == rhs);
507 return ret_value *= rhs;
519 return ret_value /= rhs;
531 return ret_value %= rhs;
543 return ret_value += rhs;
579 return ret_value -= rhs;
678 if ((uint32_t)type ==
type_ ||
691 int64_t buffer_size (
sizeof (uint32_t) * 2);
694 buffer_size +=
sizeof (
Integer);
698 buffer_size +=
sizeof (double);
724 int64_t buffer_size (
sizeof (uint32_t) * 1);
725 buffer_size += (key.size () + 1);
837 for (KnowledgeRecords::const_iterator i = records.begin ();
838 i != records.end (); ++i)
840 max = std::max <uint32_t> (i->second->quality, max);
851 for (KnowledgeMap::const_iterator i = records.begin ();
852 i != records.end (); ++i)
854 max = std::max <uint32_t> (i->second.quality, max);
891 int64_t & buffer_remaining)
895 uint32_t buff_value_size (0);
900 if (buffer_remaining >= (int64_t)
sizeof (
type))
902 memcpy (&
type, buffer,
sizeof (
type));
904 buffer +=
sizeof (
type);
906 buffer_remaining -=
sizeof (
type);
909 if (buffer_remaining >= (int64_t)
sizeof (
size))
911 memcpy (&size, buffer,
sizeof (size));
915 buff_value_size = size *
sizeof (
Integer);
917 buff_value_size = size *
sizeof (
double);
919 buff_value_size =
size;
921 buffer +=
sizeof (buff_value_size);
923 buffer_remaining = -1;
926 buffer_remaining -=
sizeof (buff_value_size);
929 if (buffer_remaining >= int64_t (buff_value_size))
933 if (buff_value_size >= 1) {
943 memcpy (&tmp, buffer,
sizeof (tmp));
949 std::vector<Integer> tmp;
952 for (uint32_t i = 0; i <
size; ++i)
955 memcpy (&cur, buffer + i *
sizeof(cur),
sizeof(cur));
965 memcpy (&tmp, buffer,
sizeof (tmp));
971 std::vector<double> tmp;
974 for (uint32_t i = 0; i <
size; ++i)
977 memcpy (&cur, buffer + i *
sizeof(cur),
sizeof(cur));
986 const unsigned char *b = (
const unsigned char *)buffer;
991 buffer_remaining = -1;
995 buffer += buff_value_size;
996 buffer_remaining -=
sizeof (char) * buff_value_size;
1006 int64_t & buffer_remaining)
1010 uint32_t key_size (0);
1013 if (buffer_remaining >= (int64_t)
sizeof (key_size))
1015 memcpy (&key_size, buffer,
sizeof (key_size));
1017 buffer +=
sizeof (key_size);
1019 buffer_remaining -=
sizeof (key_size);
1022 if (buffer_remaining >= int64_t (
sizeof (
char) * int64_t (key_size)))
1026 key.assign (buffer, key_size - 1);
1031 buffer +=
sizeof (char) * key_size;
1033 buffer_remaining -=
sizeof (char) * int64_t (key_size);
1036 buffer =
read (buffer, buffer_remaining);
1043 int64_t & buffer_remaining)
1048 if (buffer_remaining >= (int64_t)
sizeof (key_id))
1050 memcpy (&key_id, buffer,
sizeof (key_id));
1052 buffer +=
sizeof (key_id);
1053 buffer_remaining -=
sizeof (key_id);
1056 buffer =
read (buffer, buffer_remaining);
1076 uint64_t cur_clock = this->
clock;
1080 this->
clock = cur_clock;
1088 uint64_t cur_clock = this->
clock;
1091 *
this = std::move(new_value);
1092 this->
clock = cur_clock;
1218 std::shared_ptr<std::vector <unsigned char>> new_value)
1249 std::shared_ptr<std::vector <unsigned char>> new_value)
1256 template<
typename T,
1257 typename std::enable_if<std::is_integral<T>::value,
void*>
::type>
1297 template<
typename T,
1298 typename std::enable_if<std::is_floating_point<T>::value,
void*>
::type>
1342 template<
typename T,
1343 typename std::enable_if<std::is_integral<T>::value,
void*>
::type>
1375 template<
typename T,
1376 typename std::enable_if<std::is_floating_point<T>::value,
void*>
::type>
1402 inline std::shared_ptr<std::string>
1412 inline std::shared_ptr<std::string>
1416 std::shared_ptr<std::string> ret;
1428 inline std::shared_ptr<std::vector<KnowledgeRecord::Integer>>
1438 inline std::shared_ptr<std::vector<KnowledgeRecord::Integer>>
1442 std::shared_ptr<std::vector<Integer>> ret;
1454 inline std::shared_ptr<std::vector<double>>
1464 inline std::shared_ptr<std::vector<double>>
1468 std::shared_ptr<std::vector<double>> ret;
1480 inline std::shared_ptr<std::vector<unsigned char>>
1490 inline std::shared_ptr<std::vector<unsigned char>>
1494 std::shared_ptr<std::vector<unsigned char>> ret;
1507 KnowledgeRecord::operator bool (
void)
const 1514 int64_t & buffer_remaining)
const 1518 char * size_location = 0;
1519 uint32_t size_intermediate = 0;
1520 uint32_t uint32_temp;
1527 if (buffer_remaining >= encoded_size)
1530 " encoding %" PRId64
" byte message\n", encoded_size);
1533 if (buffer_remaining >= (int64_t)
sizeof (
type_))
1536 memcpy (buffer, &tmp,
sizeof (tmp));
1537 buffer +=
sizeof (tmp);
1539 buffer_remaining -=
sizeof (
type_);
1542 if (buffer_remaining >= (int64_t)
sizeof (
size))
1546 size_location = buffer;
1547 size_intermediate =
size;
1550 memcpy (buffer, &uint32_temp,
sizeof (uint32_temp));
1555 buffer +=
sizeof (
size);
1557 buffer_remaining -=
sizeof (
size);
1563 if (buffer_remaining >= int64_t (size))
1570 if (buffer_remaining >= int64_t (
sizeof (
Integer)))
1573 memcpy (buffer, &integer_temp,
sizeof (integer_temp));
1575 size_intermediate =
sizeof (
Integer);
1580 if (buffer_remaining >= int64_t (size *
sizeof (
Integer)))
1583 const Integer * ptr_temp = &(*int_array_)[0];
1586 for (uint32_t i = 0; i <
size; ++i, ++ptr_temp, ++target_buffer)
1589 memcpy (target_buffer, &integer_temp,
sizeof (
Integer));
1592 size_intermediate = size *
sizeof (
Integer);
1597 if (buffer_remaining >= int64_t (
sizeof (
double)))
1600 memcpy (buffer, &double_temp,
sizeof (
double));
1602 size_intermediate =
sizeof (double);
1607 if (buffer_remaining >= int64_t (size *
sizeof (
double)))
1610 const double * ptr_temp = &(*double_array_)[0];
1611 double * target_buffer = (
double *)buffer;
1613 for (uint32_t i = 0; i <
size; ++i, ++ptr_temp, ++target_buffer)
1616 memcpy (target_buffer, &double_temp,
sizeof (double_temp));
1619 size_intermediate = size *
sizeof (double);
1636 if (buffer_remaining >= size)
1644 buffer_remaining -= size_intermediate;
1645 buffer += size_intermediate;
1650 std::stringstream buffer;
1651 buffer <<
"KnowledgeRecord::write: ";
1652 buffer << encoded_size <<
" byte encoding cannot fit in ";
1653 buffer << buffer_remaining <<
" byte buffer\n";
1656 buffer.str ().c_str ());
1665 int64_t & buffer_remaining)
const 1670 uint32_t key_size = uint32_t (key.size () + 1);
1671 uint32_t uint32_temp;
1675 if (buffer_remaining >= encoded_size)
1678 " encoding %" PRId64
" byte message\n", encoded_size);
1681 if (buffer_remaining >= (int64_t)
sizeof (key_size))
1684 memcpy (buffer, &uint32_temp,
sizeof (uint32_temp));
1685 buffer +=
sizeof (key_size);
1687 buffer_remaining -=
sizeof (key_size);
1690 if (buffer_remaining >= (int64_t)
sizeof (char) * key_size)
1693 strncpy (buffer, key.c_str (), key_size - 1);
1694 buffer[key_size - 1] = 0;
1696 buffer +=
sizeof (char) * key_size;
1698 buffer_remaining -=
sizeof (char) * key_size;
1701 buffer =
write (buffer, buffer_remaining);
1705 std::stringstream buffer;
1706 buffer <<
"KnowledgeRecord::write: ";
1707 buffer << encoded_size <<
" byte encoding cannot fit in ";
1708 buffer << buffer_remaining <<
" byte buffer\n";
1711 buffer.str ().c_str ());
1720 int64_t & buffer_remaining)
const 1724 uint32_t uint32_temp;
1728 if (buffer_remaining >= encoded_size)
1731 " encoding %" PRId64
" byte message\n", encoded_size);
1734 if (buffer_remaining >= (int64_t)
sizeof (key_id))
1737 memcpy (buffer, &uint32_temp,
sizeof (uint32_temp));
1738 buffer +=
sizeof (key_id);
1740 buffer_remaining -=
sizeof (key_id);
1743 buffer =
write (buffer, buffer_remaining);
1747 std::stringstream buffer;
1748 buffer <<
"KnowledgeRecord::write: ";
1749 buffer << encoded_size <<
" byte encoding cannot fit in ";
1750 buffer << buffer_remaining <<
" byte buffer\n";
1753 buffer.str ().c_str ());
1762 #endif // _KNOWLEDGE_RECORD_INL_ This class encapsulates an entry in a KnowledgeBase.
uint32_t max_quality(const KnowledgeRecords &records)
Returns the maximum quality within the records.
void emplace_shared_file(Args &&...args)
Construct a shared_ptr to a file (vector of unsigned char) within this KnowledgeRecord.
bool is_true(void) const
Checks to see if the record is true.
void emplace_string(Args &&...args)
Construct a string within this KnowledgeRecord.
std::shared_ptr< std::vector< double > > share_doubles() const
void reset_value(void) noexcept
resets the variable to an integer
int32_t type(void) const
returns the size of the value
std::shared_ptr< std::vector< unsigned char > > share_binary() const
bool is_image_type(void) const
returns true if the knowledge record has an image type
helper type for specifying template type parameters using a function argument instead of inside expli...
std::shared_ptr< std::string > share_string() const
void emplace_integers(Args &&...args)
Construct a vector of integers within this KnowledgeRecord.
uint32_t quality
priority of the update
KnowledgeRecord deep_copy() const
Creates a deep copy of this knowledge record.
madara::knowledge::KnowledgeRecord KnowledgeRecord
void emplace_file(Args &&...args)
Construct a file (vector of unsigned char) within this KnowledgeRecord.
double to_double(void) const
converts the value to a float/double.
const char * read(const char *buffer, int64_t &buffer_remaining)
Reads a KnowledgeRecord instance from a buffer and updates the amount of buffer room remaining...
std::shared_ptr< std::vector< Integer > > share_integers() const
void set_file(const unsigned char *new_value, size_t size)
sets the value to an unknown file type
void clear_value(void) noexcept
clears any dynamic values.
KnowledgeRecord operator-(void) const
Negate.
bool is_file_type(void) const
returns true if the knowledge record has a file type
bool is_binary_file_type(void) const
returns true if the knowledge record has a binary file type
void set_text(const char *new_value, size_t size)
sets the value to a plaintext string
std::shared_ptr< std::vector< Integer > > int_array_
void emplace_shared_integers(Args &&...args)
Construct a shared_ptr to vector of integers within this KnowledgeRecord.
int64_t get_encoded_size(void) const
Returns the encoded size of the record.
bool exists(void) const
Checks if record exists (i.e., is not uncreated)
bool is_double_type(void) const
returns if the record is a double type (DOUBLE, DOUBLE_ARRAY)
void set_xml(const char *new_value, size_t size)
sets the value to an xml string
logger::Logger * logger_
the logger used for any internal debugging information
Provides knowledge logging services to files and terminals.
void emplace_shared_doubles(Args &&...args)
Construct a shared_ptr to vector of doubles within this KnowledgeRecord.
bool set_type(int32_t type)
Modify the type, but only if it's compatible with current type without changing any actual data store...
void emplace_shared_string(Args &&...args)
Construct a shared_ptr to a string within this KnowledgeRecord.
A multi-threaded logger for logging to one or more destinations.
~KnowledgeRecord() noexcept
void set_value(const KnowledgeRecord &new_value)
Sets the value from another KnowledgeRecord, does not copy clock and write_quality.
std::shared_ptr< std::vector< double > > take_doubles()
int status(void) const
returns the status of the record.
void set_jpeg(const unsigned char *new_value, size_t size)
sets the value to a jpeg
KnowledgeRecord operator*(const KnowledgeRecord &rhs) const
Times operator.
KnowledgeRecord & operator*=(const KnowledgeRecord &rhs)
In-place multiplication operator.
KnowledgeRecord & operator%=(const KnowledgeRecord &rhs)
In-place modulus operator.
uint64_t endian_swap(uint64_t value)
Converts a host format uint64_t into big endian.
bool operator==(const KnowledgeRecord &rhs) const
Equal to.
#define madara_logger_ptr_log(logger, level,...)
Fast version of the madara::logger::log method for Logger pointers.
::std::map< std::string, KnowledgeRecord * > KnowledgeRecords
KnowledgeRecord & operator++(void)
Preincrement operator.
std::shared_ptr< std::vector< unsigned char > > take_binary()
::std::map< std::string, KnowledgeRecord > KnowledgeMap
auto operator=(T &&t) -> typename std::enable_if<!std::is_convertible< T, KnowledgeRecord >::value, decltype(this->set_value(std::forward< T >(t)),*this)>::type
std::shared_ptr< std::vector< double > > double_array_
KnowledgeRecord operator%(const KnowledgeRecord &rhs) const
Modulus operator.
std::shared_ptr< std::vector< Integer > > take_integers()
void set_index(size_t index, T value)
sets the value at the index to the specified value.
void set_modified(void)
sets the status to modified
Integer to_integer(void) const
converts the value to an integer.
An exception for general memory errors like out-of-memory.
KnowledgeRecord & operator-=(const KnowledgeRecord &rhs)
In-place subtraction operator.
std::shared_ptr< std::vector< unsigned char > > file_value_
bool operator!(void) const
Logical not.
KnowledgeRecord operator+(const KnowledgeRecord &rhs) const
Plus operator.
KnowledgeRecord * clone(void) const
clones the record.
bool shared_
is this knowledge record's shared_ptr, if any, exposed to outside holders?
void unshare(void)
If this record holds a shared_ptr, make a copy of the underlying value so it has an exclusive copy...
KnowledgeRecord() noexcept
Provides functions and classes for the distributed knowledge base.
std::ostream & operator<<(std::ostream &stream, const KnowledgeRecord &rhs)
output stream buffering
void emplace_doubles(Args &&...args)
Construct a vector of doubles within this KnowledgeRecord.
uint32_t write_quality
write priority for any local updates
uint32_t type_
type of variable (INTEGER, DOUBLE, STRING, FILE, IMAGE)
KnowledgeRecord & operator--(void)
Predecrement operator.
KnowledgeRecord & operator+=(const KnowledgeRecord &rhs)
In-place addition operator.
bool operator!=(const KnowledgeRecord &rhs) const
Unequal to.
bool is_array_type(void) const
returns if the record is an array type (DOUBLE_ARRAY, INTEGER_ARRAY)
Copyright (c) 2015 Carnegie Mellon University.
bool is_ref_counted(void) const
returns if the record has a reference-counted type
void clear_union(void) noexcept
KnowledgeRecord & operator/=(const KnowledgeRecord &rhs)
In-place division operator.
char * write(char *buffer, int64_t &buffer_remaining) const
Writes a KnowledgeRecord instance to a buffer and updates the amount of buffer room remaining...
bool is_integer_type(void) const
returns if the record is a integer type (INTEGER, INTEGER_ARRAY)
bool is_false(void) const
Checks to see if the record is false.
bool is_string_type(void) const
returns true if the record is a string type (STRING, XML, TEXT_FILE)
std::string to_string(const std::string &delimiter=", ") const
converts the value to a string.
std::shared_ptr< std::string > take_string()
uint32_t size(void) const
returns the size of the value
KnowledgeRecord operator/(const KnowledgeRecord &rhs) const
Divides operator.
uint64_t clock
last modification time
std::shared_ptr< std::string > str_value_