#include <cassert>
#include <cstdlib>
#include <cstring>
#include "queue.h"
#include "scenario.hpp"
struct kv *
kv_alloc(const char *key, const char *value)
{
struct kv *kv = (struct kv *)malloc(sizeof(*kv));
assert(kv != NULL);
kv->key = strdup(key);
assert(kv->key != NULL);
kv->value = strdup(value);
assert(kv->value != NULL);
return kv;
}
void
kv_free(struct kv *kv)
{
assert(kv != NULL);
free(kv->key);
free(kv->value);
free(kv);
}
struct scenario *
scenario_alloc(const char *name, const char *bench)
{
struct scenario *s = (struct scenario *)malloc(sizeof(*s));
assert(s != NULL);
TAILQ_INIT(&s->head);
s->name = strdup(name);
assert(s->name != NULL);
s->benchmark = strdup(bench);
assert(s->benchmark != NULL);
s->group = NULL;
return s;
}
void
scenario_free(struct scenario *s)
{
assert(s != NULL);
while (!TAILQ_EMPTY(&s->head)) {
struct kv *kv = TAILQ_FIRST(&s->head);
TAILQ_REMOVE(&s->head, kv, next);
kv_free(kv);
}
free(s->group);
free(s->name);
free(s->benchmark);
free(s);
}
void
scenario_set_group(struct scenario *s, const char *group)
{
assert(s != NULL);
s->group = strdup(group);
}
struct scenarios *
scenarios_alloc(void)
{
struct scenarios *scenarios =
(struct scenarios *)malloc(sizeof(*scenarios));
assert(NULL != scenarios);
TAILQ_INIT(&scenarios->head);
return scenarios;
}
void
scenarios_free(struct scenarios *scenarios)
{
assert(scenarios != NULL);
while (!TAILQ_EMPTY(&scenarios->head)) {
struct scenario *sce = TAILQ_FIRST(&scenarios->head);
TAILQ_REMOVE(&scenarios->head, sce, next);
scenario_free(sce);
}
free(scenarios);
}
struct scenario *
scenarios_get_scenario(struct scenarios *ss, const char *name)
{
struct scenario *scenario;
FOREACH_SCENARIO(scenario, ss)
{
if (strcmp(scenario->name, name) == 0)
return scenario;
}
return NULL;
}
bool
contains_scenarios(int argc, char **argv, struct scenarios *ss)
{
assert(argv != NULL);
assert(argc > 0);
assert(ss != NULL);
for (int i = 0; i < argc; i++) {
if (scenarios_get_scenario(ss, argv[i]))
return true;
}
return false;
}
struct scenario *
clone_scenario(struct scenario *src_scenario)
{
assert(src_scenario != NULL);
struct scenario *new_scenario =
scenario_alloc(src_scenario->name, src_scenario->benchmark);
assert(new_scenario != NULL);
struct kv *src_kv;
FOREACH_KV(src_kv, src_scenario)
{
struct kv *new_kv = kv_alloc(src_kv->key, src_kv->value);
assert(new_kv != NULL);
TAILQ_INSERT_TAIL(&new_scenario->head, new_kv, next);
}
return new_scenario;
}
struct kv *
find_kv_in_scenario(const char *key, const struct scenario *scenario)
{
struct kv *kv;
FOREACH_KV(kv, scenario)
{
if (strcmp(kv->key, key) == 0)
return kv;
}
return NULL;
}