#ifndef SANDBOX_LINUX_BPF_DSL_SYSCALL_SET_H__
#define SANDBOX_LINUX_BPF_DSL_SYSCALL_SET_H__
#include <stdint.h>
#include <cstddef>
#include <iterator>
#include "sandbox/sandbox_export.h"
namespace sandbox {
class SANDBOX_EXPORT SyscallSet {
public:
class Iterator;
SyscallSet(const SyscallSet& ss) : set_(ss.set_) {}
SyscallSet& operator=(const SyscallSet&) = delete;
~SyscallSet() {}
Iterator begin() const;
Iterator end() const;
static SyscallSet All() { return SyscallSet(Set::ALL); }
static SyscallSet ValidOnly() { return SyscallSet(Set::VALID_ONLY); }
static SyscallSet InvalidOnly() { return SyscallSet(Set::INVALID_ONLY); }
static bool IsValid(uint32_t num);
private:
enum class Set { ALL, VALID_ONLY, INVALID_ONLY };
explicit SyscallSet(Set set) : set_(set) {}
Set set_;
friend bool operator==(const SyscallSet&, const SyscallSet&);
};
SANDBOX_EXPORT bool operator==(const SyscallSet& lhs, const SyscallSet& rhs);
class SyscallSet::Iterator {
public:
using iterator_category = std::input_iterator_tag;
using value_type = uint32_t;
using difference_type = std::ptrdiff_t;
using pointer = uint32_t*;
using reference = uint32_t&;
Iterator(const Iterator& it)
: set_(it.set_), done_(it.done_), num_(it.num_) {}
Iterator& operator=(const Iterator&) = delete;
~Iterator() {}
uint32_t operator*() const;
Iterator& operator++();
private:
Iterator(Set set, bool done);
uint32_t NextSyscall() const;
Set set_;
bool done_;
uint32_t num_;
friend SyscallSet;
friend bool operator==(const Iterator&, const Iterator&);
};
SANDBOX_EXPORT bool operator==(const SyscallSet::Iterator& lhs,
const SyscallSet::Iterator& rhs);
SANDBOX_EXPORT bool operator!=(const SyscallSet::Iterator& lhs,
const SyscallSet::Iterator& rhs);
}
#endif