#ifndef CHANGED_PROPS_SET_HPP_
#define CHANGED_PROPS_SET_HPP_
#include "openthread-core-config.h"
#include <stddef.h>
#include <openthread/error.h>
#include "lib/spinel/spinel.h"
namespace ot {
namespace Ncp {
class ChangedPropsSet
{
public:
struct Entry
{
spinel_prop_key_t mPropKey; spinel_status_t mStatus; bool mFilterable; };
ChangedPropsSet(void)
: mChangedSet(0)
, mFilterSet(0)
{
}
void Clear(void) { mChangedSet = 0; }
bool IsEmpty(void) const { return (mChangedSet == 0); }
void AddProperty(spinel_prop_key_t aPropKey) { Add(aPropKey, SPINEL_STATUS_OK); }
void AddLastStatus(spinel_status_t aStatus) { Add(SPINEL_PROP_LAST_STATUS, aStatus); }
const Entry *GetSupportedEntries(uint8_t &aNumEntries) const
{
aNumEntries = GetNumEntries();
return &mSupportedProps[0];
}
const Entry *GetEntry(uint8_t aIndex) const { return (aIndex < GetNumEntries()) ? &mSupportedProps[aIndex] : NULL; }
bool IsEntryChanged(uint8_t aIndex) const { return IsBitSet(mChangedSet, aIndex); }
void RemoveEntry(uint8_t aIndex) { ClearBit(mChangedSet, aIndex); }
otError EnablePropertyFilter(spinel_prop_key_t aPropKey, bool aEnable);
bool IsEntryFiltered(uint8_t aIndex) const { return IsBitSet(mFilterSet, aIndex); }
bool IsPropertyFiltered(spinel_prop_key_t aPropKey) const;
void ClearFilter(void) { mFilterSet = 0; }
private:
uint8_t GetNumEntries(void) const;
void Add(spinel_prop_key_t aPropKey, spinel_status_t aStatus);
static void SetBit(uint64_t &aBitset, uint8_t aBitIndex) { aBitset |= (1ULL << aBitIndex); }
static void ClearBit(uint64_t &aBitset, uint8_t aBitIndex) { aBitset &= ~(1ULL << aBitIndex); }
static bool IsBitSet(uint64_t aBitset, uint8_t aBitIndex) { return (aBitset & (1ULL << aBitIndex)) != 0; }
static const Entry mSupportedProps[];
uint64_t mChangedSet;
uint64_t mFilterSet;
};
} }
#endif