Module: OrigenTesters::Decompiler::Pattern::EnumerableExt
- Included in:
- OrigenTesters::Decompiler::Pattern
- Defined in:
- lib/origen_testers/decompiler/pattern/enumerable_ext.rb
Overview
We can’t use Ruby’s enumerable mix-in directly, as our each method isn’t a true implementation, as the mix-in expects. Instead, we’ll provide our own enumerable methods as needed that use our own each method.
Instance Method Summary collapse
- #collect(&block) ⇒ Object (also: #collect_vectors, #map, #map_vectors)
- #collect_with_index(&block) ⇒ Object (also: #collect_vectors_with_index)
- #count(&block) ⇒ Object (also: #size)
-
#each(**options, &block) ⇒ Object
(also: #each_vector)
Iterate through the vectors one by one.
- #each_vector_with_index(&block) ⇒ Object
- #find(&block) ⇒ Object (also: #detect)
- #find_all(&block) ⇒ Object (also: #select, #filter)
- #find_index(&block) ⇒ Object
- #first(n = nil) ⇒ Object
- #reject(&block) ⇒ Object
- #vector_at(index, &block) ⇒ Object
Instance Method Details
#collect(&block) ⇒ Object Also known as: collect_vectors, map, map_vectors
84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 84 def collect(&block) vectors = [] each_vector do |v| if block_given? vectors << yield(v) else vectors << v end end vectors end |
#collect_with_index(&block) ⇒ Object Also known as: collect_vectors_with_index
99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 99 def collect_with_index(&block) vectors = [] each_vector_with_index do |v, i| if block_given? vectors << yield(v, i) else vectors << v end end vectors end |
#count(&block) ⇒ Object Also known as: size
133 134 135 136 137 138 139 140 141 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 133 def count(&block) cnt = 0 if block_given? each_vector { |v| cnt += 1 if yield(v) } else each_vector { |v| cnt += 1 } end cnt end |
#each(**options, &block) ⇒ Object Also known as: each_vector
Iterate through the vectors one by one. We’ll begin reading the file from the vector start until the regex/block vector_delimiter is met. This delimiter can include multiple lines. Once the delimiter finishes, those lines will be sent to the treetop parser for conversion to an AST. Lastly, the next vector will start where the previous one left off.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 16 def each(**, &block) unless decompiled? Origen.app!.fail(message: 'Pattern has not yet been decompiled! Cannot iterate through vectors or query pattern aspects!') end vectors_started = false delimiter_klass = VectorDelimiterBase v = delimiter_klass.new(self) vector_index = 0 if direct_source? kickoff = 'source.split("\n")' else kickoff = 'File.foreach(source)' end eval(kickoff).each_with_index do |line, index| # Get to the point in the file where the vectors begin if index > section_indices[:vectors_end] && section_indices[:vectors_end] != -1 break elsif index < section_indices[:vectors_start] next end v.shift(line) if v.delimited? # index starts at 0, but most file editors start the line numbers at 1. yield(_parse_vector_(v.current_vector!, vector_index: vector_index, line: index + 1)) vector_index += 1 if v.include_last_line? # The last line is included in the current vector. v = delimiter_klass.new(self) else # The last line shouldn't be included in this vector. # Shift it into a new one. v = delimiter_klass.new(self) v.shift(line) # Check if this new vector is delimited before grabbing # the next line. if v.delimited? yield(_parse_vector_(v.current_vector!, vector_index: vector_index)) v = delimiter_klass.new(self) vector_index += 1 end end end end end |
#each_vector_with_index(&block) ⇒ Object
67 68 69 70 71 72 73 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 67 def each_vector_with_index(&block) i = 0 each_vector do |v| yield(v, i) i += 1 end end |
#find(&block) ⇒ Object Also known as: detect
122 123 124 125 126 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 122 def find(&block) if block_given? each_vector { |v| return v if yield(v) } end end |
#find_all(&block) ⇒ Object Also known as: select, filter
112 113 114 115 116 117 118 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 112 def find_all(&block) vectors = [] if block_given? each_vector { |v| vectors << v if yield(v) } end vectors end |
#find_index(&block) ⇒ Object
129 130 131 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 129 def find_index(&block) find(&block).vector_index end |
#first(n = nil) ⇒ Object
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 152 def first(n = nil) if n if n <= 0 return nil end vectors = [] each_vector_with_index do |v, i| vectors << v if n == (i - 1) return vectors end end vectors else each_vector { |v| return v } end end |
#reject(&block) ⇒ Object
144 145 146 147 148 149 150 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 144 def reject(&block) vectors = [] if block_given? each_vector { |v| vectors << v unless yield(v) } end vectors end |
#vector_at(index, &block) ⇒ Object
75 76 77 78 79 80 81 82 |
# File 'lib/origen_testers/decompiler/pattern/enumerable_ext.rb', line 75 def vector_at(index, &block) each_vector_with_index do |v, i| if i == index return v end end nil end |