lts/src/histogram.cc
#include "histogram.h" // NOLINT(build/include_inline)
#include "histogram-inl.h"
#include "memory_tracker-inl.h"
namespace node {
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Local;
using v8::Map;
using v8::Number;
using v8::ObjectTemplate;
using v8::String;
using v8::Value;
Histogram::Histogram(int64_t lowest, int64_t highest, int figures) {
hdr_histogram* histogram;
CHECK_EQ(0, hdr_init(lowest, highest, figures, &histogram));
histogram_.reset(histogram);
}
HistogramBase::HistogramBase(
Environment* env,
v8::Local<v8::Object> wrap,
int64_t lowest,
int64_t highest,
int figures)
: BaseObject(env, wrap),
Histogram(lowest, highest, figures) {
MakeWeak();
}
void HistogramBase::MemoryInfo(MemoryTracker* tracker) const {
tracker->TrackFieldWithSize("histogram", GetMemorySize());
}
void HistogramBase::GetMin(const FunctionCallbackInfo<Value>& args) {
HistogramBase* histogram;
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder());
double value = static_cast<double>(histogram->Min());
args.GetReturnValue().Set(value);
}
void HistogramBase::GetMax(const FunctionCallbackInfo<Value>& args) {
HistogramBase* histogram;
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder());
double value = static_cast<double>(histogram->Max());
args.GetReturnValue().Set(value);
}
void HistogramBase::GetMean(const FunctionCallbackInfo<Value>& args) {
HistogramBase* histogram;
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder());
args.GetReturnValue().Set(histogram->Mean());
}
void HistogramBase::GetExceeds(const FunctionCallbackInfo<Value>& args) {
HistogramBase* histogram;
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder());
double value = static_cast<double>(histogram->Exceeds());
args.GetReturnValue().Set(value);
}
void HistogramBase::GetStddev(const FunctionCallbackInfo<Value>& args) {
HistogramBase* histogram;
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder());
args.GetReturnValue().Set(histogram->Stddev());
}
void HistogramBase::GetPercentile(
const FunctionCallbackInfo<Value>& args) {
HistogramBase* histogram;
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder());
CHECK(args[0]->IsNumber());
double percentile = args[0].As<Number>()->Value();
args.GetReturnValue().Set(histogram->Percentile(percentile));
}
void HistogramBase::GetPercentiles(
const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
HistogramBase* histogram;
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder());
CHECK(args[0]->IsMap());
Local<Map> map = args[0].As<Map>();
histogram->Percentiles([map, env](double key, double value) {
map->Set(
env->context(),
Number::New(env->isolate(), key),
Number::New(env->isolate(), value)).IsEmpty();
});
}
void HistogramBase::DoReset(const FunctionCallbackInfo<Value>& args) {
HistogramBase* histogram;
ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder());
histogram->ResetState();
}
BaseObjectPtr<HistogramBase> HistogramBase::New(
Environment* env,
int64_t lowest,
int64_t highest,
int figures) {
CHECK_LE(lowest, highest);
CHECK_GT(figures, 0);
v8::Local<v8::Object> obj;
auto tmpl = env->histogram_instance_template();
if (!tmpl->NewInstance(env->context()).ToLocal(&obj))
return {};
return MakeDetachedBaseObject<HistogramBase>(
env, obj, lowest, highest, figures);
}
void HistogramBase::Initialize(Environment* env) {
// Guard against multiple initializations
if (!env->histogram_instance_template().IsEmpty())
return;
Local<FunctionTemplate> histogram = FunctionTemplate::New(env->isolate());
Local<String> classname = FIXED_ONE_BYTE_STRING(env->isolate(), "Histogram");
histogram->SetClassName(classname);
Local<ObjectTemplate> histogramt =
histogram->InstanceTemplate();
histogramt->SetInternalFieldCount(1);
env->SetProtoMethod(histogram, "exceeds", HistogramBase::GetExceeds);
env->SetProtoMethod(histogram, "min", HistogramBase::GetMin);
env->SetProtoMethod(histogram, "max", HistogramBase::GetMax);
env->SetProtoMethod(histogram, "mean", HistogramBase::GetMean);
env->SetProtoMethod(histogram, "stddev", HistogramBase::GetStddev);
env->SetProtoMethod(histogram, "percentile", HistogramBase::GetPercentile);
env->SetProtoMethod(histogram, "percentiles", HistogramBase::GetPercentiles);
env->SetProtoMethod(histogram, "reset", HistogramBase::DoReset);
env->set_histogram_instance_template(histogramt);
}
} // namespace node