Guest User

Untitled

a guest
Aug 26th, 2018
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. const std = @import("std");
  2. const mem = @import("std").mem;
  3. const builtin = @import("builtin");
  4.  
  5. fn tuple(comptime T: type) type {
  6.     return struct {
  7.         idx: usize,
  8.         item: T,
  9.     };
  10. }
  11.  
  12. fn Iterator(comptime SELF: type, comptime Item: type) type {
  13.     return struct {
  14.         pub fn REQUIRE_next(self: *SELF) ?Item {
  15.             return undefined;
  16.         }
  17.  
  18.         pub fn enumerate(self: SELF) Enumerate(SELF, Item) {
  19.             return Enumerate(SELF, Item).init(self);          
  20.         }
  21.     };
  22. }
  23.  
  24. pub fn Enumerate(comptime Iter: type, comptime Item: type) type {
  25.     comptime {
  26.         require(Iterator(Iter, Item), Iter, "Enumerate only works for Iterators");
  27.     }
  28.  
  29.     return struct {
  30.         idx: usize,
  31.         iter: Iter,
  32.  
  33.         fn next(self: *this) ?tuple(Item) {
  34.             var nxt = self.iter.next() orelse return null;
  35.                    
  36.             self.idx += 1;
  37.  
  38.             return tuple(?Item) {.idx = self.idx, .item = nxt };  
  39.         }
  40.  
  41.         fn init(it: Iter) this {
  42.             return this {
  43.                 .idx = 0,
  44.                 .iter = it
  45.             };
  46.         }
  47.     };
  48.  
  49. }
  50.  
  51. fn range() type {
  52.     return struct {
  53.  
  54.         const Self = this;
  55.         start: usize,
  56.         end: usize,
  57.  
  58.         fn init(start: usize, end: usize) Self {
  59.             return Self {
  60.                 .start = start,
  61.                 .end = end,
  62.             };
  63.         }
  64.  
  65.         fn next(self: *Self) ?usize {
  66.             if (self.start >= self.end) {
  67.                 return null;
  68.             }
  69.  
  70.             self.start += 1;
  71.             return self.start;
  72.         }
  73.     };
  74. }
  75.  
  76. fn require(comptime TRAIT: var, comptime CHECK: var, comptime msg: []const u8) void {
  77.     const fn_names_to_check = @typeInfo(TRAIT).Struct;
  78.    
  79.     const to_check_type_info = @typeInfo(CHECK).Struct;
  80.    
  81.     inline for(fn_names_to_check.defs) |name| {
  82.         inline for (to_check_type_info.defs) |def| {
  83.             if (mem.eql(u8, name.name[0..7], "REQUIRE")) {
  84.                 if(mem.eql(u8, name.name[8..], def.name)) {
  85.                     if (mem.eql(u8, @typeName(name.data.Fn.fn_type), @typeName(def.data.Fn.fn_type))) {
  86.                         return;
  87.                     }
  88.                 }
  89.             }
  90.         }
  91.     }
  92.  
  93.     @compileError(msg);
  94. }
  95.  
  96. pub fn main() void {
  97.  
  98.  
  99.     var r = range().init(1, 100);
  100.  
  101.     var enumer = Iterator(range(), usize).enumerate(r);
  102.    
  103.     while (enumer.next()) |item| {
  104.         std.debug.warn("{} {}\n", item.idx, item.item);
  105.     }
  106.  
  107.     //while (r.next()) |item| {
  108.     //    std.debug.warn("{}", item);
  109.     //}
  110.  
  111. }
Advertisement
Add Comment
Please, Sign In to add comment