2015-06-21 23:42:29 -07:00
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
/* Copyright (c) FIRST 2015. All Rights Reserved. */
|
|
|
|
|
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
|
|
|
|
/* must be accompanied by the FIRST BSD license file in the root directory of */
|
|
|
|
|
/* the project. */
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
#ifndef NT_STORAGE_H_
|
|
|
|
|
#define NT_STORAGE_H_
|
|
|
|
|
|
2015-06-27 10:22:59 -07:00
|
|
|
#include <cstddef>
|
2015-07-17 07:21:07 -07:00
|
|
|
#include <functional>
|
2015-07-14 23:15:08 -07:00
|
|
|
#include <iosfwd>
|
|
|
|
|
#include <memory>
|
2015-07-18 01:29:51 -07:00
|
|
|
#include <mutex>
|
2015-06-27 10:22:59 -07:00
|
|
|
|
2015-06-21 23:42:29 -07:00
|
|
|
#include "llvm/StringMap.h"
|
2015-07-18 01:29:51 -07:00
|
|
|
#include "support/ConcurrentQueue.h"
|
|
|
|
|
#include "ntcore_cpp.h"
|
2015-07-17 23:41:25 -07:00
|
|
|
#include "SequenceNumber.h"
|
2015-06-21 23:42:29 -07:00
|
|
|
|
2015-07-17 07:21:07 -07:00
|
|
|
namespace nt {
|
2015-06-21 23:42:29 -07:00
|
|
|
|
2015-06-25 22:57:43 -07:00
|
|
|
class StorageEntry {
|
|
|
|
|
public:
|
2015-07-17 23:41:25 -07:00
|
|
|
StorageEntry() : id(0xffff), flags(0) {}
|
2015-06-21 23:42:29 -07:00
|
|
|
|
2015-07-17 23:41:25 -07:00
|
|
|
bool IsPersistent() const { return (flags & NT_PERSISTENT) != 0; }
|
2015-06-28 21:52:06 -07:00
|
|
|
|
2015-07-17 23:41:25 -07:00
|
|
|
std::shared_ptr<Value> value;
|
|
|
|
|
unsigned int id;
|
|
|
|
|
unsigned int flags;
|
|
|
|
|
SequenceNumber seq_num;
|
2015-06-21 23:42:29 -07:00
|
|
|
};
|
|
|
|
|
|
2015-06-25 22:57:43 -07:00
|
|
|
class Storage {
|
|
|
|
|
public:
|
|
|
|
|
static Storage& GetInstance() {
|
2015-07-14 23:15:08 -07:00
|
|
|
if (!m_instance) m_instance.reset(new Storage);
|
2015-06-25 22:57:43 -07:00
|
|
|
return *m_instance;
|
|
|
|
|
}
|
2015-07-14 23:15:08 -07:00
|
|
|
~Storage();
|
2015-06-21 23:42:29 -07:00
|
|
|
|
2015-06-25 22:57:43 -07:00
|
|
|
typedef llvm::StringMap<StorageEntry> EntriesMap;
|
2015-06-27 10:02:20 -07:00
|
|
|
|
2015-07-18 01:29:51 -07:00
|
|
|
struct Update {
|
|
|
|
|
std::string name;
|
|
|
|
|
enum Kind { kAssign, kValueUpdate, kFlagsUpdate, kDelete, kDeleteAll };
|
|
|
|
|
Kind kind;
|
|
|
|
|
};
|
|
|
|
|
typedef ConcurrentQueue<Update> UpdateQueue;
|
|
|
|
|
|
|
|
|
|
std::mutex& mutex() { return m_mutex; }
|
2015-06-27 10:02:20 -07:00
|
|
|
EntriesMap& entries() { return m_entries; }
|
|
|
|
|
const EntriesMap& entries() const { return m_entries; }
|
2015-06-21 23:42:29 -07:00
|
|
|
|
2015-07-18 01:29:51 -07:00
|
|
|
UpdateQueue& updates() { return m_updates; }
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<Value> GetEntryValue(StringRef name) const;
|
|
|
|
|
bool SetEntryValue(StringRef name, std::shared_ptr<Value> value);
|
|
|
|
|
void SetEntryTypeValue(StringRef name, std::shared_ptr<Value> value);
|
|
|
|
|
void SetEntryFlags(StringRef name, unsigned int flags);
|
|
|
|
|
unsigned int GetEntryFlags(StringRef name) const;
|
|
|
|
|
void DeleteEntry(StringRef name);
|
|
|
|
|
void DeleteAllEntries();
|
|
|
|
|
std::vector<EntryInfo> GetEntryInfo(StringRef prefix, unsigned int types);
|
|
|
|
|
|
2015-06-27 10:22:59 -07:00
|
|
|
void SavePersistent(std::ostream& os) const;
|
2015-07-17 07:21:07 -07:00
|
|
|
bool LoadPersistent(
|
|
|
|
|
std::istream& is,
|
|
|
|
|
std::function<void(std::size_t line, const char* msg)> warn);
|
2015-06-27 10:22:59 -07:00
|
|
|
|
2015-06-25 22:57:43 -07:00
|
|
|
private:
|
|
|
|
|
Storage();
|
|
|
|
|
Storage(const Storage&) = delete;
|
|
|
|
|
Storage& operator=(const Storage&) = delete;
|
2015-06-21 23:42:29 -07:00
|
|
|
|
2015-07-18 01:29:51 -07:00
|
|
|
mutable std::mutex m_mutex;
|
2015-06-27 10:02:20 -07:00
|
|
|
EntriesMap m_entries;
|
2015-07-18 01:29:51 -07:00
|
|
|
UpdateQueue m_updates;
|
2015-06-27 10:02:20 -07:00
|
|
|
|
2015-07-14 23:15:08 -07:00
|
|
|
static std::unique_ptr<Storage> m_instance;
|
2015-06-21 23:42:29 -07:00
|
|
|
};
|
|
|
|
|
|
2015-07-17 07:21:07 -07:00
|
|
|
} // namespace nt
|
2015-06-21 23:42:29 -07:00
|
|
|
|
2015-06-25 22:57:43 -07:00
|
|
|
#endif // NT_STORAGE_H_
|