return try self.dbi.has(k);
}
pub const Iterator = struct {
+ pub const Result = struct { key: K, val: V };
cursor: lmdb.Cursor,
+ dir: enum { Forward, Backward },
k: ?K,
v: ?V,
- pub fn next(self: *Iterator) ?struct { key: K, val: V } {
+ pub fn next(self: *Iterator) ?Result {
if (self.k != null and self.v != null) {
- const result = .{ .key = self.k.?, .val = self.v.? };
+ const result = Result{ .key = self.k.?, .val = self.v.? };
var k = self.k.?;
- self.v = self.cursor.get(&k, V, .Next) catch return null;
+ if (self.dir == .Forward) {
+ self.v = self.cursor.get(&k, V, .Next) catch return null;
+ } else {
+ self.v = self.cursor.get(&k, V, .Prev) catch return null;
+ }
if (self.v != null) {
self.k = k;
}
var k: K = undefined;
const v = try cursor.get(&k, V, .First);
- return .{ .cursor = cursor, .k = k, .v = v };
+ return .{ .cursor = cursor, .dir = .Forward, .k = k, .v = v };
+ }
+ pub fn reverse_iterator(self: Self) !Iterator {
+ var cursor = try self.dbi.cursor();
+
+ var k: K = undefined;
+ const v = try cursor.get(&k, V, .Last);
+ return .{ .cursor = cursor, .dir = .Backward, .k = k, .v = v };
}
};
}
return self.dbi.has(self.item_idx(key));
}
pub const Iterator = struct {
- pub const Result = ?struct { key: K, val: V };
+ pub const Result = struct { key: K, val: V };
slv: SetListViewBase(K, V),
idx: ?K,
dir: enum { Forward, Backward },
- pub fn next(self: *Iterator) Result {
+ pub fn next(self: *Iterator) ?Result {
if (self.idx != null) {
const k = self.idx.?;
const item = self.slv.item_get(k) catch return null;