 |
SWC-DB
v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
|
Go to the documentation of this file.
7 #ifndef swcdb_db_cells_CellValueSerialFieldUpdate_h
8 #define swcdb_db_cells_CellValueSerialFieldUpdate_h
14 namespace SWC {
namespace DB {
namespace Cell {
48 bool set_ctrl(
const char** ptr, uint32_t* remainp,
49 bool w_value_ctrl) noexcept {
50 if(*remainp && **ptr ==
'!') {
55 if(w_value_ctrl && *remainp) {
61 }
else if(**ptr ==
'O') {
117 virtual void encode(uint8_t** bufp)
const {
121 virtual void decode(
const uint8_t** ptrp,
size_t* remainp) {
124 virtual std::ostream&
print(std::ostream& out)
const;
156 void set_op(const
char** ptr, uint32_t* remainp,
157 bool w_value_ctrl=false) noexcept {
158 if(!
set_ctrl(ptr, remainp, w_value_ctrl))
178 if(*remainp && **ptr ==
'=')
186 void apply(
const T& in_value,
T& value)
const {
213 apply(
reinterpret_cast<const T*
>(infieldp)->value, field.value);
218 const T& p1,
const T& p2)
const noexcept {
226 void encode(uint8_t** bufp)
const override {
232 void decode(
const uint8_t** ptrp,
size_t* remainp)
override {
237 virtual std::ostream&
print(std::ostream& out)
const override;
275 op == OP::OVERWRITE ||
280 return op == OP::BY_UNIQUE;
284 return op == OP::BY_COND;
288 return op == OP::BY_INDEX;
298 template<
bool is_upper_type=false>
300 void set_op(
const char** ptr, uint32_t* remainp,
int& err,
301 bool w_value_ctrl=
false) noexcept {
302 if(!
set_ctrl(ptr, remainp, w_value_ctrl))
337 if(*remainp && **ptr ==
'=')
344 char** end_at =
const_cast<char**
>(ptr);
345 int64_t v = std::strtoll(*ptr, end_at, 10);
352 len = *end_at - *ptr;
380 uint32_t p(
pos > field.
size ? uint32_t(field.
size) : uint32_t(
pos));
388 case OP::OVERWRITE: {
403 uint32_t at = p + infield.
size;
405 memcpy(value.
base + at, field.
base + at, field.
size - at);
414 remain = field.
size - (p + infield.
size);
417 memcpy(value.
base + p, field.
base + p + infield.
size, remain);
427 void apply(
const std::string& in_value, std::string& value)
const {
429 reinterpret_cast<uint8_t*
>(value.data()),
435 const_cast<uint8_t*
>(
436 reinterpret_cast<const uint8_t*
>(in_value.data())
443 value.assign(
reinterpret_cast<const char*
>(buf.
base), buf.
size);
448 apply(*
reinterpret_cast<const T*
>(infieldp), field);
453 const T& p1,
const T& p2)
const noexcept {
456 reinterpret_cast<const uint8_t*
>(p1.data()),
458 reinterpret_cast<const uint8_t*
>(p2.data()),
469 virtual void encode(uint8_t** bufp)
const override {
478 virtual void decode(
const uint8_t** ptrp,
size_t* remainp)
override {
486 virtual std::ostream&
print(std::ostream& out)
const override;
493 template<
typename UpdateField_T>
496 template<
typename... ArgsT>
499 : UpdateField_T(std::forward<ArgsT>(args)...),
504 : UpdateField_T(ptrp, remainp),
533 void ext_decode(
bool w_data,
const uint8_t** ptrp,
size_t* remainp) {
538 std::ostream&
ext_print(
bool w_data, std::ostream& out)
const {
540 out <<
" data=" <<
data;
548 template<
typename UpdateField_T,
typename ValueT>
580 template<
typename... ArgsT>
582 UpdateField_T&
add_item(uint32_t i, ArgsT&&... args) {
588 auto infield(
reinterpret_cast<const T*
>(infieldp));
598 infield->convert_to(*(
data =
new DataT()));
601 field.convert_to(vec);
610 case OP::OVERWRITE: {
612 infield->convert_to(*(
data =
new DataT()));
615 field.convert_to(vec);
629 for(uint32_t i = 0; i < p; ++i)
631 for(
auto it = vec_in.
cbegin(); it < vec_in.
cend(); ++it)
634 for(
auto it = vec.
begin() + items.
size(); it < vec.
end(); ++it)
637 field.set_from(items);
643 infield->convert_to(*(
data =
new DataT()));
645 auto has_count = field.convert_less_to(vec,
pos,
data->
size());
646 if(has_count != vec.
size())
651 case OP::BY_UNIQUE: {
653 infield->convert_to(*(
data =
new DataT()));
655 std::set<ValueT> vec;
656 field.convert_to(vec);
657 auto itu = vec_in.
cbegin();
659 if(iti->is_value_set())
661 else if(iti->is_value_del())
669 infield->convert_to(*(
data =
new DataT()));
672 field.convert_to(vec);
673 auto itu = vec_in.
cbegin();
677 for(; it < vec.
cend(); ++it) {
678 if(iti->is_matching(comp, *itu, *it))
681 if(it == vec.
cend()) {
682 if(iti->is_value_set())
684 }
else if(iti->is_value_del()) {
695 infield->convert_to(*(
data =
new DataT()));
698 field.convert_to(vec);
700 auto itu = vec_in.
cbegin();
702 if(iti->data < vec.
size())
703 iti->apply(*itu, vec[iti->data]);
704 else if(!iti->is_no_add_field())
720 for(
auto& item : *
this)
721 len += item.ext_encoded_length(w_data);
726 void encode(uint8_t** bufp)
const override {
731 for(
auto& item : *
this)
732 item.ext_encode(w_data, bufp);
736 void decode(
const uint8_t** ptrp,
size_t* remainp)
override {
746 virtual std::ostream&
print(std::ostream& out)
const override {
751 for(
auto& item : *
this)
752 item.ext_print(w_data, out) <<
',';
760 typedef FieldUpdate_LIST_ITEMS<FieldUpdate_MATH, int64_t>
770 #ifdef SWC_IMPL_SOURCE
774 #endif // swcdb_db_cells_CellValueSerialFieldUpdate_h
SWC_CAN_INLINE iterator erase(size_type offset) noexcept(_NoExceptMoveAssign &&_NoExceptDestructor)
SWC_CAN_INLINE FieldUpdate(uint8_t a_ctrl) noexcept
SWC_CAN_INLINE bool is_value_set() const noexcept
FieldUpdate(FieldUpdate &&) noexcept=default
FieldUpdate_LIST_ITEMS & operator=(const FieldUpdate_LIST_ITEMS &)=delete
constexpr SWC_CAN_INLINE void encode_vi24(uint8_t **bufp, uint24_t val)
static constexpr const uint8_t CTRL_DELETE_FIELD
SWC_CAN_INLINE void ext_decode(bool w_data, const uint8_t **ptrp, size_t *remainp)
SWC_CAN_INLINE bool is_matching_extended(uint8_t comp, const uint8_t *p1, uint32_t p1_len, const uint8_t *p2, uint32_t p2_len)
constexpr SWC_CAN_INLINE uint8_t encoded_length_vi24(uint24_t val) noexcept
virtual SWC_CAN_INLINE uint24_t encoded_length() const noexcept
SWC_CAN_INLINE void set_delete_field() noexcept
SWC_CAN_INLINE FieldUpdate(const uint8_t **ptrp, size_t *remainp)
constexpr SWC_CAN_INLINE uint8_t encoded_length_vi32(uint32_t val) noexcept
SWC_CAN_INLINE void decode(const uint8_t **ptrp, size_t *remainp) override
constexpr const uint24_t UINT24_MAX
SWC_CAN_INLINE void set_value_del() noexcept
SWC_CAN_INLINE UpdateField_T & add_item(uint32_t i, ArgsT &&... args)
FieldUpdate_LIST_ITEMS(FieldUpdate_LIST_ITEMS &&)=delete
SWC_CAN_INLINE void apply(const Field *infieldp, T &field) const
SWC_CAN_INLINE bool has_pos() const noexcept
SWC_CAN_INLINE void ext_encode(bool w_data, uint8_t **bufp) const
SWC_CAN_INLINE void decode(const uint8_t **ptrp, size_t *remainp) override
SWC_CAN_INLINE FieldUpdate_LIST_ITEMS(const uint8_t **ptrp, size_t *remainp)
SWC_CAN_INLINE void apply(const T &in_value, T &value) const
constexpr SWC_CAN_INLINE void encode_i8(uint8_t **bufp, uint8_t val) noexcept
SWC_CAN_INLINE void apply(const StaticBuffer &infield, StaticBuffer &field) const
SWC_CAN_INLINE void set_data(uint32_t i) noexcept
SWC_CAN_INLINE bool set_ctrl(const char **ptr, uint32_t *remainp, bool w_value_ctrl) noexcept
SWC_CAN_INLINE bool is_op_by_idx() const noexcept
SWC_CAN_INLINE bool is_no_add_field() const noexcept
FieldUpdate_LIST_ITEMS< FieldUpdate_MATH, int64_t > FieldUpdate_LIST_INT64
SWC_CAN_INLINE bool is_op_require_data() const noexcept
SWC_CAN_INLINE void encode(uint8_t **bufp) const override
static constexpr const uint8_t CTRL_VALUE_DEL
virtual SWC_CAN_INLINE void decode(const uint8_t **ptrp, size_t *remainp)
bool str_eq(const char *s1, const char *s2) noexcept SWC_ATTRIBS((SWC_ATTRIB_O3))
static constexpr const uint8_t CTRL_DEFAULT
SWC_CAN_INLINE bool is_delete_field() const noexcept
FieldUpdate_LIST_ITEMS< FieldUpdate_LIST, std::string > FieldUpdate_LIST_BYTES
constexpr SWC_CAN_INLINE iterator end() noexcept
std::ostream & ext_print(bool w_data, std::ostream &out) const
The SWC-DB C++ namespace 'SWC'.
SWC_CAN_INLINE void set_value_set() noexcept
SWC_CAN_INLINE FieldUpdate_Ext(bool w_data, const uint8_t **ptrp, size_t *remainp)
constexpr SWC_CAN_INLINE uint24_t decode_vi24(const uint8_t **bufp, size_t *remainp)
virtual std::ostream & print(std::ostream &out) const override
SWC_CAN_INLINE FieldUpdate_LIST_ITEMS(OP a_op=OP::REPLACE, uint24_t a_pos=0, uint8_t a_ctrl=CTRL_DEFAULT) noexcept
virtual SWC_CAN_INLINE void encode(uint8_t **bufp) const
SWC_CAN_INLINE FieldUpdate_MATH(OP a_op=OP::EQUAL, uint8_t a_ctrl=CTRL_DEFAULT) noexcept
SWC_CAN_INLINE bool has_item_op() const noexcept
SWC_CAN_INLINE bool is_matching(Condition::Comp comp, const T &p1, const T &p2) const noexcept
virtual std::ostream & print(std::ostream &out) const override
virtual SWC_CAN_INLINE uint24_t encoded_length() const noexcept override
SWC_CAN_INLINE bool is_matching(Condition::Comp comp, const T &p1, const T &p2) const noexcept
SWC_CAN_INLINE uint24_t encoded_length() const noexcept override
SWC_CAN_INLINE FieldUpdate_MATH(const uint8_t **ptrp, size_t *remainp)
FieldUpdate_Ext(FieldUpdate_Ext &&) noexcept=default
FieldUpdate_LIST_ITEMS & operator=(FieldUpdate_LIST_ITEMS &&)=delete
SWC_CAN_INLINE bool is_matching(bool volumetric, uint8_t comp, const uint8_t *p1, uint32_t p1_len, const uint8_t *p2, uint32_t p2_len)
SWC_CAN_INLINE void apply(const Field *infieldp, T &field) const
FieldUpdate_LIST_ITEMS(const FieldUpdate_LIST_ITEMS &)=delete
SWC_CAN_INLINE void reserve()
virtual ~FieldUpdate_LIST_ITEMS() noexcept
SWC_CAN_INLINE bool is_op_by_unique() const noexcept
SWC_CAN_INLINE void apply(const Field *infieldp, T &field) const
static constexpr const uint8_t CTRL_VALUE_SET
SWC_CAN_INLINE bool is_op_by_cond() const noexcept
Core::StaticBuffer StaticBuffer
SWC_CAN_INLINE void set_no_add_field() noexcept
constexpr SWC_CAN_INLINE const_iterator cend() const noexcept
SWC_CAN_INLINE void set_op(const char **ptr, uint32_t *remainp, bool w_value_ctrl=false) noexcept
static constexpr const uint8_t CTRL_NO_ADD_FIELD
constexpr SWC_CAN_INLINE void encode_vi32(uint8_t **bufp, uint32_t val)
SWC_CAN_INLINE void encode(uint8_t **bufp) const override
SWC_CAN_INLINE FieldUpdate_Ext(uint32_t i, ArgsT &&... args) noexcept
SWC_CAN_INLINE FieldUpdate_LIST(const uint8_t **ptrp, size_t *remainp)
SWC_CAN_INLINE FieldUpdate_LIST(OP a_op=OP::REPLACE, uint24_t a_pos=0, uint8_t a_ctrl=CTRL_DEFAULT) noexcept
constexpr const int24_t INT24_MIN
Core::Vector< ValueT > DataT
FieldUpdate_MATH(FieldUpdate_MATH &&) noexcept=default
virtual std::ostream & print(std::ostream &out) const
SWC_CAN_INLINE void set_op(const char **ptr, uint32_t *remainp, int &err, bool w_value_ctrl=false) noexcept
SWC_CAN_INLINE bool is_sub_op_required() const noexcept
SWC_CAN_INLINE uint32_t ext_encoded_length(bool w_data) const noexcept
SWC_CAN_INLINE void apply(const std::string &in_value, std::string &value) const
SWC_CAN_INLINE void push_back(ArgsT &&... args)
constexpr SWC_CAN_INLINE const_iterator cbegin() const noexcept
SWC_CAN_INLINE uint24_t encoded_length() const noexcept override
constexpr SWC_CAN_INLINE uint8_t decode_i8(const uint8_t **bufp, size_t *remainp)
constexpr SWC_CAN_INLINE size_type size() const noexcept
virtual std::ostream & print(std::ostream &out) const override
virtual SWC_CAN_INLINE void decode(const uint8_t **ptrp, size_t *remainp) override
SWC_CAN_INLINE reference emplace_back(ArgsT &&... args)
SWC_CAN_INLINE iterator insert(size_type offset, ArgsT &&... args)
SWC_CAN_INLINE void reserve(size_type cap)
virtual SWC_CAN_INLINE void encode(uint8_t **bufp) const override
constexpr SWC_CAN_INLINE uint32_t decode_vi32(const uint8_t **bufp, size_t *remainp)
SWC_CAN_INLINE bool is_value_del() const noexcept
constexpr SWC_CAN_INLINE iterator begin() noexcept
SWC_CAN_INLINE void assign(const value_type *data, size_t len)
void set(value_type *data, size_t len, bool take_ownership) noexcept