mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
Switch VectorVal BroValUnion to store std::vector<IntrusivePtr<Val>>
This changes the return type of AsVector() from std::vector<Val*>*
This commit is contained in:
parent
40db09ccbf
commit
69533bcbc6
5 changed files with 27 additions and 47 deletions
2
NEWS
2
NEWS
|
@ -92,6 +92,8 @@ Changed Functionality
|
||||||
- ``AsRecord()`` and ``AsNonConstRecord()`` have changed to return
|
- ``AsRecord()`` and ``AsNonConstRecord()`` have changed to return
|
||||||
``std::vector<IntrusivePtr<Val>>*``.
|
``std::vector<IntrusivePtr<Val>>*``.
|
||||||
|
|
||||||
|
- ``AsVector()`` has changed to return ``std::vector<IntrusivePtr<Val>>*``.
|
||||||
|
|
||||||
Removed Functionality
|
Removed Functionality
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
31
src/Val.cc
31
src/Val.cc
|
@ -3040,14 +3040,11 @@ VectorVal::VectorVal(VectorType* t) : VectorVal({NewRef{}, t})
|
||||||
|
|
||||||
VectorVal::VectorVal(IntrusivePtr<VectorType> t) : Val(std::move(t))
|
VectorVal::VectorVal(IntrusivePtr<VectorType> t) : Val(std::move(t))
|
||||||
{
|
{
|
||||||
val.vector_val = new vector<Val*>();
|
val.vector_val = new vector<IntrusivePtr<Val>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorVal::~VectorVal()
|
VectorVal::~VectorVal()
|
||||||
{
|
{
|
||||||
for ( unsigned int i = 0; i < val.vector_val->size(); ++i )
|
|
||||||
Unref((*val.vector_val)[i]);
|
|
||||||
|
|
||||||
delete val.vector_val;
|
delete val.vector_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3062,19 +3059,10 @@ bool VectorVal::Assign(unsigned int index, IntrusivePtr<Val> element)
|
||||||
! same_type(element->GetType().get(), GetType()->AsVectorType()->Yield().get(), false) )
|
! same_type(element->GetType().get(), GetType()->AsVectorType()->Yield().get(), false) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Val* val_at_index = nullptr;
|
if ( index >= val.vector_val->size() )
|
||||||
|
|
||||||
if ( index < val.vector_val->size() )
|
|
||||||
val_at_index = (*val.vector_val)[index];
|
|
||||||
else
|
|
||||||
val.vector_val->resize(index + 1);
|
val.vector_val->resize(index + 1);
|
||||||
|
|
||||||
Unref(val_at_index);
|
(*val.vector_val)[index] = std::move(element);
|
||||||
|
|
||||||
// Note: we do *not* Ref() the element, if any, at this point.
|
|
||||||
// AssignExpr::Eval() already does this; other callers must remember
|
|
||||||
// to do it similarly.
|
|
||||||
(*val.vector_val)[index] = element.release();
|
|
||||||
|
|
||||||
Modified();
|
Modified();
|
||||||
return true;
|
return true;
|
||||||
|
@ -3100,17 +3088,14 @@ bool VectorVal::Insert(unsigned int index, IntrusivePtr<Val> element)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<Val*>::iterator it;
|
vector<IntrusivePtr<Val>>::iterator it;
|
||||||
|
|
||||||
if ( index < val.vector_val->size() )
|
if ( index < val.vector_val->size() )
|
||||||
it = std::next(val.vector_val->begin(), index);
|
it = std::next(val.vector_val->begin(), index);
|
||||||
else
|
else
|
||||||
it = val.vector_val->end();
|
it = val.vector_val->end();
|
||||||
|
|
||||||
// Note: we do *not* Ref() the element, if any, at this point.
|
val.vector_val->insert(it, std::move(element));
|
||||||
// AssignExpr::Eval() already does this; other callers must remember
|
|
||||||
// to do it similarly.
|
|
||||||
val.vector_val->insert(it, element.release());
|
|
||||||
|
|
||||||
Modified();
|
Modified();
|
||||||
return true;
|
return true;
|
||||||
|
@ -3121,10 +3106,8 @@ bool VectorVal::Remove(unsigned int index)
|
||||||
if ( index >= val.vector_val->size() )
|
if ( index >= val.vector_val->size() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Val* val_at_index = (*val.vector_val)[index];
|
|
||||||
auto it = std::next(val.vector_val->begin(), index);
|
auto it = std::next(val.vector_val->begin(), index);
|
||||||
val.vector_val->erase(it);
|
val.vector_val->erase(it);
|
||||||
Unref(val_at_index);
|
|
||||||
|
|
||||||
Modified();
|
Modified();
|
||||||
return true;
|
return true;
|
||||||
|
@ -3159,7 +3142,7 @@ Val* VectorVal::Lookup(unsigned int index) const
|
||||||
if ( index >= val.vector_val->size() )
|
if ( index >= val.vector_val->size() )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return (*val.vector_val)[index];
|
return (*val.vector_val)[index].get();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int VectorVal::Resize(unsigned int new_num_elements)
|
unsigned int VectorVal::Resize(unsigned int new_num_elements)
|
||||||
|
@ -3188,7 +3171,7 @@ IntrusivePtr<Val> VectorVal::DoClone(CloneState* state)
|
||||||
for ( unsigned int i = 0; i < val.vector_val->size(); ++i )
|
for ( unsigned int i = 0; i < val.vector_val->size(); ++i )
|
||||||
{
|
{
|
||||||
auto v = (*val.vector_val)[i]->Clone(state);
|
auto v = (*val.vector_val)[i]->Clone(state);
|
||||||
vv->val.vector_val->push_back(v.release());
|
vv->val.vector_val->push_back(std::move(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
return vv;
|
return vv;
|
||||||
|
|
|
@ -81,7 +81,7 @@ union BroValUnion {
|
||||||
RE_Matcher* re_val;
|
RE_Matcher* re_val;
|
||||||
PDict<TableEntryVal>* table_val;
|
PDict<TableEntryVal>* table_val;
|
||||||
std::vector<IntrusivePtr<Val>>* record_val;
|
std::vector<IntrusivePtr<Val>>* record_val;
|
||||||
std::vector<Val*>* vector_val;
|
std::vector<IntrusivePtr<Val>>* vector_val;
|
||||||
|
|
||||||
BroValUnion() = default;
|
BroValUnion() = default;
|
||||||
|
|
||||||
|
@ -114,9 +114,6 @@ union BroValUnion {
|
||||||
|
|
||||||
constexpr BroValUnion(PDict<TableEntryVal>* value) noexcept
|
constexpr BroValUnion(PDict<TableEntryVal>* value) noexcept
|
||||||
: table_val(value) {}
|
: table_val(value) {}
|
||||||
|
|
||||||
constexpr BroValUnion(std::vector<Val*> *value) noexcept
|
|
||||||
: vector_val(value) {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class Val : public BroObj {
|
class Val : public BroObj {
|
||||||
|
@ -221,7 +218,7 @@ public:
|
||||||
CONST_ACCESSOR(TYPE_RECORD, std::vector<IntrusivePtr<Val>>*, record_val, AsRecord)
|
CONST_ACCESSOR(TYPE_RECORD, std::vector<IntrusivePtr<Val>>*, record_val, AsRecord)
|
||||||
CONST_ACCESSOR(TYPE_FILE, BroFile*, file_val, AsFile)
|
CONST_ACCESSOR(TYPE_FILE, BroFile*, file_val, AsFile)
|
||||||
CONST_ACCESSOR(TYPE_PATTERN, RE_Matcher*, re_val, AsPattern)
|
CONST_ACCESSOR(TYPE_PATTERN, RE_Matcher*, re_val, AsPattern)
|
||||||
CONST_ACCESSOR(TYPE_VECTOR, std::vector<Val*>*, vector_val, AsVector)
|
CONST_ACCESSOR(TYPE_VECTOR, std::vector<IntrusivePtr<Val>>*, vector_val, AsVector)
|
||||||
|
|
||||||
const IPPrefix& AsSubNet() const
|
const IPPrefix& AsSubNet() const
|
||||||
{
|
{
|
||||||
|
@ -255,7 +252,7 @@ public:
|
||||||
ACCESSOR(TYPE_FUNC, Func*, func_val, AsFunc)
|
ACCESSOR(TYPE_FUNC, Func*, func_val, AsFunc)
|
||||||
ACCESSOR(TYPE_FILE, BroFile*, file_val, AsFile)
|
ACCESSOR(TYPE_FILE, BroFile*, file_val, AsFile)
|
||||||
ACCESSOR(TYPE_PATTERN, RE_Matcher*, re_val, AsPattern)
|
ACCESSOR(TYPE_PATTERN, RE_Matcher*, re_val, AsPattern)
|
||||||
ACCESSOR(TYPE_VECTOR, std::vector<Val*>*, vector_val, AsVector)
|
ACCESSOR(TYPE_VECTOR, std::vector<IntrusivePtr<Val>>*, vector_val, AsVector)
|
||||||
|
|
||||||
IntrusivePtr<Func> AsFuncPtr() const;
|
IntrusivePtr<Func> AsFuncPtr() const;
|
||||||
|
|
||||||
|
|
|
@ -705,7 +705,7 @@ function str_smith_waterman%(s1: string, s2: string, params: sw_params%) : sw_su
|
||||||
## .. zeek:see:: split_string split_string1 split_string_all split_string_n
|
## .. zeek:see:: split_string split_string1 split_string_all split_string_n
|
||||||
function str_split%(s: string, idx: index_vec%): string_vec
|
function str_split%(s: string, idx: index_vec%): string_vec
|
||||||
%{
|
%{
|
||||||
vector<Val*>* idx_v = idx->AsVector();
|
auto idx_v = idx->AsVector();
|
||||||
BroString::IdxVec indices(idx_v->size());
|
BroString::IdxVec indices(idx_v->size());
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
|
30
src/zeek.bif
30
src/zeek.bif
|
@ -1327,10 +1327,10 @@ function all_set%(v: any%) : bool
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%%{
|
%%{
|
||||||
static Func* sort_function_comp = 0;
|
static Func* sort_function_comp = nullptr;
|
||||||
static Val** index_map = 0; // used for indirect sorting to support order()
|
static std::vector<const IntrusivePtr<Val>*> index_map; // used for indirect sorting to support order()
|
||||||
|
|
||||||
bool sort_function(Val* a, Val* b)
|
bool sort_function(const IntrusivePtr<Val>& a, const IntrusivePtr<Val>& b)
|
||||||
{
|
{
|
||||||
// Sort missing values as "high".
|
// Sort missing values as "high".
|
||||||
if ( ! a )
|
if ( ! a )
|
||||||
|
@ -1338,8 +1338,7 @@ bool sort_function(Val* a, Val* b)
|
||||||
if ( ! b )
|
if ( ! b )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
auto result = sort_function_comp->operator()(IntrusivePtr{NewRef{}, a},
|
auto result = sort_function_comp->operator()(a, b);
|
||||||
IntrusivePtr{NewRef{}, b});
|
|
||||||
int int_result = result->CoerceToInt();
|
int int_result = result->CoerceToInt();
|
||||||
|
|
||||||
return int_result < 0;
|
return int_result < 0;
|
||||||
|
@ -1347,10 +1346,10 @@ bool sort_function(Val* a, Val* b)
|
||||||
|
|
||||||
bool indirect_sort_function(size_t a, size_t b)
|
bool indirect_sort_function(size_t a, size_t b)
|
||||||
{
|
{
|
||||||
return sort_function(index_map[a], index_map[b]);
|
return sort_function(*index_map[a], *index_map[b]);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool signed_sort_function (Val* a, Val* b)
|
bool signed_sort_function (const IntrusivePtr<Val>& a, const IntrusivePtr<Val>& b)
|
||||||
{
|
{
|
||||||
if ( ! a )
|
if ( ! a )
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1363,7 +1362,7 @@ bool signed_sort_function (Val* a, Val* b)
|
||||||
return ia < ib;
|
return ia < ib;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool unsigned_sort_function (Val* a, Val* b)
|
bool unsigned_sort_function (const IntrusivePtr<Val>& a, const IntrusivePtr<Val>& b)
|
||||||
{
|
{
|
||||||
if ( ! a )
|
if ( ! a )
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1378,12 +1377,12 @@ bool unsigned_sort_function (Val* a, Val* b)
|
||||||
|
|
||||||
bool indirect_signed_sort_function(size_t a, size_t b)
|
bool indirect_signed_sort_function(size_t a, size_t b)
|
||||||
{
|
{
|
||||||
return signed_sort_function(index_map[a], index_map[b]);
|
return signed_sort_function(*index_map[a], *index_map[b]);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool indirect_unsigned_sort_function(size_t a, size_t b)
|
bool indirect_unsigned_sort_function(size_t a, size_t b)
|
||||||
{
|
{
|
||||||
return unsigned_sort_function(index_map[a], index_map[b]);
|
return unsigned_sort_function(*index_map[a], *index_map[b]);
|
||||||
}
|
}
|
||||||
%%}
|
%%}
|
||||||
|
|
||||||
|
@ -1431,7 +1430,7 @@ function sort%(v: any, ...%) : any
|
||||||
if ( ! comp && ! IsIntegral(elt_type->Tag()) )
|
if ( ! comp && ! IsIntegral(elt_type->Tag()) )
|
||||||
builtin_error("comparison function required for sort() with non-integral types");
|
builtin_error("comparison function required for sort() with non-integral types");
|
||||||
|
|
||||||
vector<Val*>& vv = *v->AsVector();
|
auto& vv = *v->AsVector();
|
||||||
|
|
||||||
if ( comp )
|
if ( comp )
|
||||||
{
|
{
|
||||||
|
@ -1501,18 +1500,18 @@ function order%(v: any, ...%) : index_vec
|
||||||
if ( ! comp && ! IsIntegral(elt_type->Tag()) )
|
if ( ! comp && ! IsIntegral(elt_type->Tag()) )
|
||||||
builtin_error("comparison function required for order() with non-integral types");
|
builtin_error("comparison function required for order() with non-integral types");
|
||||||
|
|
||||||
vector<Val*>& vv = *v->AsVector();
|
auto& vv = *v->AsVector();
|
||||||
auto n = vv.size();
|
auto n = vv.size();
|
||||||
|
|
||||||
// Set up initial mapping of indices directly to corresponding
|
// Set up initial mapping of indices directly to corresponding
|
||||||
// elements.
|
// elements.
|
||||||
vector<size_t> ind_vv(n);
|
vector<size_t> ind_vv(n);
|
||||||
index_map = new Val*[n];
|
index_map.reserve(n);
|
||||||
size_t i;
|
size_t i;
|
||||||
for ( i = 0; i < n; ++i )
|
for ( i = 0; i < n; ++i )
|
||||||
{
|
{
|
||||||
ind_vv[i] = i;
|
ind_vv[i] = i;
|
||||||
index_map[i] = vv[i];
|
index_map.emplace_back(&vv[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( comp )
|
if ( comp )
|
||||||
|
@ -1537,8 +1536,7 @@ function order%(v: any, ...%) : index_vec
|
||||||
sort(ind_vv.begin(), ind_vv.end(), indirect_signed_sort_function);
|
sort(ind_vv.begin(), ind_vv.end(), indirect_signed_sort_function);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete [] index_map;
|
index_map = {};
|
||||||
index_map = 0;
|
|
||||||
|
|
||||||
// Now spin through ind_vv to read out the rearrangement.
|
// Now spin through ind_vv to read out the rearrangement.
|
||||||
for ( i = 0; i < n; ++i )
|
for ( i = 0; i < n; ++i )
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue