mirror of
https://github.com/zeek/zeek.git
synced 2025-10-12 19:48:20 +00:00
Merge remote-tracking branch 'upstream/master' into paraglob
This commit is contained in:
commit
a5f6757d7d
522 changed files with 8063 additions and 15259 deletions
169
src/OpaqueVal.h
169
src/OpaqueVal.h
|
@ -3,14 +3,158 @@
|
|||
#ifndef OPAQUEVAL_H
|
||||
#define OPAQUEVAL_H
|
||||
|
||||
<<<<<<< HEAD
|
||||
#include <typeinfo>
|
||||
#include <memory> // std::unique_ptr
|
||||
|
||||
=======
|
||||
>>>>>>> upstream/master
|
||||
#include "RandTest.h"
|
||||
#include "Val.h"
|
||||
#include "digest.h"
|
||||
#include "src/paraglob.h"
|
||||
|
||||
class OpaqueVal;
|
||||
|
||||
/**
|
||||
* Singleton that registers all available all available types of opaque
|
||||
* values. This faciliates their serialization into Broker values.
|
||||
*/
|
||||
class OpaqueMgr {
|
||||
public:
|
||||
using Factory = OpaqueVal* ();
|
||||
|
||||
/**
|
||||
* Return's a unique ID for the type of an opaque value.
|
||||
* @param v opaque value to return type for; its class must have been
|
||||
* registered with the manager, otherwise this method will abort
|
||||
* execution.
|
||||
*
|
||||
* @return type ID, which can used with *Instantiate()* to create a
|
||||
* new instance of the same type.
|
||||
*/
|
||||
const std::string& TypeID(const OpaqueVal* v) const;
|
||||
|
||||
/**
|
||||
* Instantiates a new opaque value of a specific opaque type.
|
||||
*
|
||||
* @param id unique type ID for the class to instantiate; this will
|
||||
* normally have been returned earlier by *TypeID()*.
|
||||
*
|
||||
* @return A freshly instantiated value of the OpaqueVal-derived
|
||||
* classes that *id* specifies, with reference count at +1. If *id*
|
||||
* is unknown, this will return null.
|
||||
*
|
||||
*/
|
||||
OpaqueVal* Instantiate(const std::string& id) const;
|
||||
|
||||
/** Returns the global manager singleton object. */
|
||||
static OpaqueMgr* mgr();
|
||||
|
||||
/**
|
||||
* Internal helper class to register an OpaqueVal-derived classes
|
||||
* with the manager.
|
||||
*/
|
||||
template<class T>
|
||||
class Register {
|
||||
public:
|
||||
Register(const char* id)
|
||||
{ OpaqueMgr::mgr()->_types.emplace(id, &T::OpaqueInstantiate); }
|
||||
};
|
||||
|
||||
private:
|
||||
std::unordered_map<std::string, Factory*> _types;
|
||||
};
|
||||
|
||||
/** Macro to insert into an OpaqueVal-derived class's declaration. */
|
||||
#define DECLARE_OPAQUE_VALUE(T) \
|
||||
friend class OpaqueMgr::Register<T>; \
|
||||
broker::expected<broker::data> DoSerialize() const override; \
|
||||
bool DoUnserialize(const broker::data& data) override; \
|
||||
const char* OpaqueName() const override { return #T; } \
|
||||
static OpaqueVal* OpaqueInstantiate() { return new T(); }
|
||||
|
||||
#define __OPAQUE_MERGE(a, b) a ## b
|
||||
#define __OPAQUE_ID(x) __OPAQUE_MERGE(_opaque, x)
|
||||
|
||||
/** Macro to insert into an OpaqueVal-derived class's implementation file. */
|
||||
#define IMPLEMENT_OPAQUE_VALUE(T) static OpaqueMgr::Register<T> __OPAQUE_ID(__LINE__)(#T);
|
||||
|
||||
/**
|
||||
* Base class for all opaque values. Opaque values are types that are managed
|
||||
* completely internally, with no further script-level operators provided
|
||||
* (other than bif functions). See OpaqueVal.h for derived classes.
|
||||
*/
|
||||
class OpaqueVal : public Val {
|
||||
public:
|
||||
explicit OpaqueVal(OpaqueType* t);
|
||||
~OpaqueVal() override;
|
||||
|
||||
/**
|
||||
* Serializes the value into a Broker representation.
|
||||
*
|
||||
* @return the broker representation, or an error if serialization
|
||||
* isn't supported or failed.
|
||||
*/
|
||||
broker::expected<broker::data> Serialize() const;
|
||||
|
||||
/**
|
||||
* Reinstantiates a value from its serialized Broker representation.
|
||||
*
|
||||
* @param data Broker representation as returned by *Serialize()*.
|
||||
* @return unserialized instances with reference count at +1
|
||||
*/
|
||||
static OpaqueVal* Unserialize(const broker::data& data);
|
||||
|
||||
protected:
|
||||
friend class Val;
|
||||
friend class OpaqueMgr;
|
||||
OpaqueVal() { }
|
||||
|
||||
/**
|
||||
* Must be overridden to provide a serialized version of the derived
|
||||
* class' state.
|
||||
*
|
||||
* @return the serialized data or an error if serialization
|
||||
* isn't supported or failed.
|
||||
*/
|
||||
virtual broker::expected<broker::data> DoSerialize() const = 0;
|
||||
|
||||
/**
|
||||
* Must be overridden to recreate the the derived class' state from a
|
||||
* serialization.
|
||||
*
|
||||
* @return true if successful.
|
||||
*/
|
||||
virtual bool DoUnserialize(const broker::data& data) = 0;
|
||||
|
||||
/**
|
||||
* Internal helper for the serialization machinery. Automatically
|
||||
* overridden by the `DECLARE_OPAQUE_VALUE` macro.
|
||||
*/
|
||||
virtual const char* OpaqueName() const = 0;
|
||||
|
||||
/**
|
||||
* Provides an implementation of *Val::DoClone()* that leverages the
|
||||
* serialization methods to deep-copy an instance. Derived classes
|
||||
* may also override this with a more efficient custom clone
|
||||
* implementation of their own.
|
||||
*/
|
||||
Val* DoClone(CloneState* state) override;
|
||||
|
||||
/**
|
||||
* Helper function for derived class that need to record a type
|
||||
* during serialization.
|
||||
*/
|
||||
static broker::expected<broker::data> SerializeType(BroType* t);
|
||||
|
||||
/**
|
||||
* Helper function for derived class that need to restore a type
|
||||
* during unserialization. Returns the type at reference count +1.
|
||||
*/
|
||||
static BroType* UnserializeType(const broker::data& data);
|
||||
};
|
||||
|
||||
namespace probabilistic {
|
||||
class BloomFilter;
|
||||
class CardinalityCounter;
|
||||
|
@ -24,15 +168,13 @@ public:
|
|||
virtual StringVal* Get();
|
||||
|
||||
protected:
|
||||
HashVal() { };
|
||||
HashVal() { valid = false; }
|
||||
explicit HashVal(OpaqueType* t);
|
||||
|
||||
virtual bool DoInit();
|
||||
virtual bool DoFeed(const void* data, size_t size);
|
||||
virtual StringVal* DoGet();
|
||||
|
||||
DECLARE_SERIAL(HashVal);
|
||||
|
||||
private:
|
||||
// This flag exists because Get() can only be called once.
|
||||
bool valid;
|
||||
|
@ -58,8 +200,7 @@ protected:
|
|||
bool DoFeed(const void* data, size_t size) override;
|
||||
StringVal* DoGet() override;
|
||||
|
||||
DECLARE_SERIAL(MD5Val);
|
||||
|
||||
DECLARE_OPAQUE_VALUE(MD5Val)
|
||||
private:
|
||||
EVP_MD_CTX* ctx;
|
||||
};
|
||||
|
@ -80,8 +221,7 @@ protected:
|
|||
bool DoFeed(const void* data, size_t size) override;
|
||||
StringVal* DoGet() override;
|
||||
|
||||
DECLARE_SERIAL(SHA1Val);
|
||||
|
||||
DECLARE_OPAQUE_VALUE(SHA1Val)
|
||||
private:
|
||||
EVP_MD_CTX* ctx;
|
||||
};
|
||||
|
@ -102,8 +242,7 @@ protected:
|
|||
bool DoFeed(const void* data, size_t size) override;
|
||||
StringVal* DoGet() override;
|
||||
|
||||
DECLARE_SERIAL(SHA256Val);
|
||||
|
||||
DECLARE_OPAQUE_VALUE(SHA256Val)
|
||||
private:
|
||||
EVP_MD_CTX* ctx;
|
||||
};
|
||||
|
@ -112,8 +251,6 @@ class EntropyVal : public OpaqueVal {
|
|||
public:
|
||||
EntropyVal();
|
||||
|
||||
Val* DoClone(CloneState* state) override;
|
||||
|
||||
bool Feed(const void* data, size_t size);
|
||||
bool Get(double *r_ent, double *r_chisq, double *r_mean,
|
||||
double *r_montepicalc, double *r_scc);
|
||||
|
@ -121,8 +258,7 @@ public:
|
|||
protected:
|
||||
friend class Val;
|
||||
|
||||
DECLARE_SERIAL(EntropyVal);
|
||||
|
||||
DECLARE_OPAQUE_VALUE(EntropyVal)
|
||||
private:
|
||||
RandTest state;
|
||||
};
|
||||
|
@ -151,8 +287,7 @@ protected:
|
|||
BloomFilterVal();
|
||||
explicit BloomFilterVal(OpaqueType* t);
|
||||
|
||||
DECLARE_SERIAL(BloomFilterVal);
|
||||
|
||||
DECLARE_OPAQUE_VALUE(BloomFilterVal)
|
||||
private:
|
||||
// Disable.
|
||||
BloomFilterVal(const BloomFilterVal&);
|
||||
|
@ -176,18 +311,16 @@ public:
|
|||
BroType* Type() const;
|
||||
bool Typify(BroType* type);
|
||||
|
||||
|
||||
probabilistic::CardinalityCounter* Get() { return c; };
|
||||
|
||||
protected:
|
||||
CardinalityVal();
|
||||
|
||||
DECLARE_OPAQUE_VALUE(CardinalityVal)
|
||||
private:
|
||||
BroType* type;
|
||||
CompositeHash* hash;
|
||||
probabilistic::CardinalityCounter* c;
|
||||
|
||||
DECLARE_SERIAL(CardinalityVal);
|
||||
};
|
||||
|
||||
class ParaglobVal : public OpaqueVal {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue