mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
98 lines
5.2 KiB
C++
98 lines
5.2 KiB
C++
// See the file "COPYING" in the main distribution directory for copyright.
|
|
|
|
// Run-time support for vector-oriented operations in C++-compiled scripts.
|
|
// The scope is unary (including appending), binary, and conditional
|
|
// operations. It does not include operations common to other aggregates,
|
|
// such as indexing and explicit coercion (but does include low-level
|
|
// coercion needed to support unary and binary operations).
|
|
|
|
#pragma once
|
|
|
|
#include "zeek/Val.h"
|
|
|
|
namespace zeek::detail {
|
|
|
|
// Appends v2 to the vector v1. A separate function because of the
|
|
// need to support assignment cascades.
|
|
inline ValPtr vector_append__CPP(VectorValPtr v1, const ValPtr& v2) {
|
|
v1->Assign(v1->Size(), v2);
|
|
return v1;
|
|
}
|
|
|
|
// Appends vector v2 to the vector v1.
|
|
inline ValPtr vector_vec_append__CPP(VectorValPtr v1, const VectorValPtr& v2) {
|
|
if ( ! v2->AddTo(v1.get(), false) )
|
|
reporter->CPPRuntimeError("incompatible vector element assignment");
|
|
return v1;
|
|
}
|
|
|
|
// Unary vector operations.
|
|
extern VectorValPtr vec_op_pos__CPP(const VectorValPtr& v, const TypePtr& t);
|
|
extern VectorValPtr vec_op_neg__CPP(const VectorValPtr& v, const TypePtr& t);
|
|
extern VectorValPtr vec_op_not__CPP(const VectorValPtr& v, const TypePtr& t);
|
|
extern VectorValPtr vec_op_comp__CPP(const VectorValPtr& v, const TypePtr& t);
|
|
|
|
// Binary vector operations.
|
|
extern VectorValPtr vec_op_add__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_sub__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_mul__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_div__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_mod__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_and__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_or__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_xor__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_andand__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_oror__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_lshift__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_rshift__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
|
|
// Vector relational operations.
|
|
extern VectorValPtr vec_op_lt__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_gt__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_eq__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_ne__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_le__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr vec_op_ge__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
|
|
// The following are to support ++/-- operations on vectors ...
|
|
extern VectorValPtr vec_op_add__CPP(VectorValPtr v, int incr);
|
|
extern VectorValPtr vec_op_sub__CPP(VectorValPtr v, int i);
|
|
|
|
// ... and these for vector-plus-scalar and vector-plus-vector string
|
|
// operations.
|
|
extern VectorValPtr str_vec_op_add__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr str_vec_op_add__CPP(const VectorValPtr& v1, const StringValPtr& v2);
|
|
extern VectorValPtr str_vec_op_add__CPP(const StringValPtr& v1, const VectorValPtr& v2);
|
|
|
|
// String vector relationals.
|
|
extern VectorValPtr str_vec_op_lt__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr str_vec_op_le__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr str_vec_op_eq__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr str_vec_op_ne__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr str_vec_op_gt__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr str_vec_op_ge__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
|
|
// Pattern vector relationals.
|
|
extern VectorValPtr pat_vec_op_eq__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
extern VectorValPtr pat_vec_op_ne__CPP(const VectorValPtr& v1, const VectorValPtr& v2);
|
|
|
|
// Support for vector conditional ('?:') expressions. Using the boolean
|
|
// vector v1 as a selector, returns a new vector populated with the
|
|
// elements selected out of v2 and v3.
|
|
extern VectorValPtr vector_select__CPP(const VectorValPtr& v1, VectorValPtr v2, VectorValPtr v3);
|
|
|
|
// Returns a new vector reflecting the given vector coerced to the given
|
|
// type. Assumes v already has the correct internal type. This can go
|
|
// away after we finish migrating to ZVal's.
|
|
extern VectorValPtr vector_coerce_to__CPP(const VectorValPtr& v, const TypePtr& targ);
|
|
|
|
// Similar coercion, but works for v having perhaps not the correct type.
|
|
extern VectorValPtr vec_coerce_to_zeek_int_t__CPP(const VectorValPtr& v, TypePtr targ);
|
|
extern VectorValPtr vec_coerce_to_zeek_uint_t__CPP(const VectorValPtr& v, TypePtr targ);
|
|
extern VectorValPtr vec_coerce_to_double__CPP(const VectorValPtr& v, TypePtr targ);
|
|
|
|
// A dummy function used during code generation for unsupported operations
|
|
// that mix vector and scalar arguments.
|
|
extern VectorValPtr vec_scalar_mixed_with_vector();
|
|
|
|
} // namespace zeek::detail
|