我想要一个提供内存数据结构的库,以便我可以编写,例如:
cache.insert(key,value,expiry)
我可以使用cache[key]
之类的内容检索该值,除非它已经过了到期秒。
可以吗?我应该使用什么库?
如果可能,请选择D的库
答案 0 :(得分:3)
我没有意识到任何这样做的图书馆。另一方面,让一些事情发挥作用并不是很多工作。这是我在十分钟内聚集在一起的东西:
struct Dict(K, V, E)
if (isExpiry!E)
{
import std.typecons : Tuple;
private:
Tuple!(V, "value", E, "expiry")[K] _payload;
public:
V opIndex(K key)
{
return *(key in this);
}
V* opBinaryRight(string op : "in")(K key)
{
auto p = key in _payload;
if (!p || p.expiry.expired) return null;
return &p.value;
}
void insert(K key, V value, E expiry)
{
expiry.initialize();
_payload[key] = typeof(_payload[key])(value, expiry);
}
void remove(K key)
{
_payload.remove(key);
}
}
enum isExpiry(T) = is(typeof((T t){
t.initialize();
if (t.expired) {}
}));
static assert(!isExpiry!int);
struct Timeout
{
import core.time;
Duration duration;
MonoTime start;
void initialize() {
start = MonoTime.currTime;
}
@property
bool expired()
{
auto elapsed = MonoTime.currTime - start;
return elapsed > duration;
}
}
static assert(isExpiry!Timeout);
unittest
{
import core.time;
import core.thread;
Dict!(int, string, Timeout) a;
assert(3 !in a);
a.insert(3, "a", Timeout(100.dur!"msecs"));
a.insert(4, "b", Timeout(10.dur!"days"));
assert(3 in a);
assert(4 in a);
Thread.sleep(200.dur!"msecs");
assert(3 !in a);
assert(4 in a);
a.remove(4);
assert(4 !in a);
}