using Qrakhen.Qamp.Core.Collections; using Qrakhen.Qamp.Core.Values; using String = Qrakhen.Qamp.Core.Values.Objects.String; namespace Qrakhen.Qamp.Core.Execution; public class InstructionPtr : Pointer { public Segment Segment; public Instruction Instruction => Segment.Instructions[Ptr]; public InstructionPtr(Segment segment, int position = 0) : base(segment.Instructions, position) { Segment = segment; } public long NextLong() { long value = Segment.ReadLong(Ptr); Ptr += sizeof(long); return value; } public Value NextConstant() { return Segment.Constants[NextDynamic()]; } public String NextString() { Value value = NextConstant(); if (value.IsString) return value.Ptr.As()!; throw new Exception($"Expected string, got {value}"); } public long NextDynamic() { var result = Segment.ReadDynamic(Ptr, out int read); Ptr += read; return result; } public String? GetStringConstant(long offset) => Segment.Constants[offset].Ptr.Value as String; public static Instruction operator +(InstructionPtr ptr, int value) => ptr.Segment.Instructions[ptr.Ptr + value]; public static Instruction operator -(InstructionPtr ptr, int value) => ptr.Segment.Instructions[ptr.Ptr - value]; public static InstructionPtr operator ++(InstructionPtr ptr) { ptr.Ptr++; return ptr; } public static InstructionPtr operator --(InstructionPtr ptr) { ptr.Ptr--; return ptr; } }