rubyx/lib/common/list.rb

61 lines
1.7 KiB
Ruby
Raw Normal View History

module Common
module List
# set the next instruction (also aliased as <<)
# throw an error if that is set, use insert for that use case
# return the instruction, so chaining works as one wants (not backwards)
2018-03-11 11:41:15 +01:00
def set_next( nekst )
raise "Next already set #{@next}" if @next
@next = nekst
nekst
end
# during translation we replace one by one
# TODO avoid this by building a new list
# Make arm instruction not derive from risc (which is weird anyway)
# and include the List into it, translate in same way we go from mom->risc
2018-03-11 11:41:15 +01:00
def replace_next( nekst )
old = @next
@next = nekst
@next.append old.next if old
end
# get the next instruction (without arg given )
# when given an interger, advance along the line that many time and return.
def next( amount = 1)
(amount == 1) ? @next : @next.next(amount-1)
end
# set the give instruction as the next, while moving any existing
# instruction along to the given ones's next.
# ie insert into the linked list that the instructions form
# but allowing the instruction to be a list too (ie more than one)
2018-03-11 11:41:15 +01:00
def insert( instruction )
instruction.last.set_next @next
@next = instruction.last
end
# return last set instruction. ie follow the linked list until it stops
def last
code = self
code = code.next while( code.next )
return code
end
# set next for the last (see last)
# so append the given code to the linked list at the end
2018-03-11 11:41:15 +01:00
def append( code )
last.set_next code
2018-03-15 17:24:03 +01:00
self
end
alias :<< :append
2018-03-11 11:41:15 +01:00
def length( labels = [] )
ret = 1
ret += self.next.length( labels ) if self.next
ret
end
end
end