#pragma once namespace nall { template<> struct vector : vector_base { using type = vector; using vector_base::vector_base; template auto appendl(U value, u32 size) -> void { for(u32 byte : range(size)) append(u8(value >> byte * 8)); } template auto appendm(U value, u32 size) -> void { for(u32 byte : nall::reverse(range(size))) append(u8(value >> byte * 8)); } //note: string_view is not declared here yet ... auto appends(array_view memory) -> void { for(u8 byte : memory) append(byte); } template auto readl(s32 offset, u32 size) -> U { if(offset < 0) offset = this->size() - abs(offset); U value = 0; for(u32 byte : range(size)) value |= (U)operator[](offset + byte) << byte * 8; return value; } auto view(u32 offset, u32 length) -> array_view { #ifdef DEBUG struct out_of_bounds {}; if(offset + length >= size()) throw out_of_bounds{}; #endif return {data() + offset, length}; } }; }