[ox/fs] Add new Directory type
This commit is contained in:
		
							
								
								
									
										66
									
								
								deps/ox/src/ox/ptrarith/nodebuffer.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								deps/ox/src/ox/ptrarith/nodebuffer.hpp
									
									
									
									
										vendored
									
									
								
							@@ -24,7 +24,51 @@ class __attribute__((packed)) NodeBuffer {
 | 
			
		||||
			ox::LittleEndian<size_t> firstItem = 0;
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		using ItemPtr = ox::ptrarith::Ptr<Item, size_t, sizeof(Header)>;
 | 
			
		||||
		using ItemPtr = Ptr<Item, size_t, sizeof(Header)>;
 | 
			
		||||
 | 
			
		||||
		class Iterator {
 | 
			
		||||
			private:
 | 
			
		||||
				NodeBuffer *m_buffer = nullptr;
 | 
			
		||||
				ItemPtr m_current;
 | 
			
		||||
				size_t m_it = 0;
 | 
			
		||||
 | 
			
		||||
			public:
 | 
			
		||||
				Iterator(NodeBuffer *buffer, ItemPtr current) {
 | 
			
		||||
					m_buffer = buffer;
 | 
			
		||||
					m_current = current;
 | 
			
		||||
					oxTrace("ox::ptrarith::Iterator::start") << current.offset();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				operator const Item*() const {
 | 
			
		||||
					return m_current;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				operator Item*() {
 | 
			
		||||
					return m_current;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				const Item *operator->() const {
 | 
			
		||||
					return m_current;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				Item *operator->() {
 | 
			
		||||
					return m_current;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				bool hasNext() {
 | 
			
		||||
					if (m_current.valid()) {
 | 
			
		||||
						oxTrace("ox::ptrarith::NodeBuffer::Iterator::hasNext::current") << m_current.offset();
 | 
			
		||||
						auto next = m_buffer->next(m_current);
 | 
			
		||||
						return next.valid() && m_buffer->firstItem() != next;
 | 
			
		||||
					}
 | 
			
		||||
					return false;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				void next() {
 | 
			
		||||
					oxTrace("ox::ptrarith::NodeBuffer::Iterator::next") << m_it++;
 | 
			
		||||
					m_current = m_buffer->next(m_current);
 | 
			
		||||
				}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		Header m_header;
 | 
			
		||||
 | 
			
		||||
@@ -33,6 +77,10 @@ class __attribute__((packed)) NodeBuffer {
 | 
			
		||||
 | 
			
		||||
		explicit NodeBuffer(size_t size);
 | 
			
		||||
 | 
			
		||||
		const Iterator iterator() const;
 | 
			
		||||
 | 
			
		||||
		Iterator iterator();
 | 
			
		||||
 | 
			
		||||
		ItemPtr firstItem();
 | 
			
		||||
 | 
			
		||||
		ItemPtr lastItem();
 | 
			
		||||
@@ -84,8 +132,20 @@ NodeBuffer<size_t, Item>::NodeBuffer(size_t size) {
 | 
			
		||||
	m_header.size = size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename size_t, typename Item>
 | 
			
		||||
const typename NodeBuffer<size_t, Item>::Iterator NodeBuffer<size_t, Item>::iterator() const {
 | 
			
		||||
	return Iterator(this, firstItem());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename size_t, typename Item>
 | 
			
		||||
typename NodeBuffer<size_t, Item>::Iterator NodeBuffer<size_t, Item>::iterator() {
 | 
			
		||||
	oxTrace("ox::ptrarith::NodeBuffer::iterator::size") << m_header.size;
 | 
			
		||||
	return Iterator(this, firstItem());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename size_t, typename Item>
 | 
			
		||||
typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::firstItem() {
 | 
			
		||||
	oxTrace("ox::ptrarith::NodeBuffer::firstItem") << m_header.firstItem;
 | 
			
		||||
	return ptr(m_header.firstItem);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -121,12 +181,14 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::ptr(size_t
 | 
			
		||||
	// make sure this can be read as an Item, and then use Item::size for the size
 | 
			
		||||
	auto itemSpace = m_header.size - itemOffset;
 | 
			
		||||
	auto item = reinterpret_cast<Item*>(reinterpret_cast<uint8_t*>(this) + itemOffset);
 | 
			
		||||
	oxTrace("ox::ptrarith::NodeBuffer::ptr::itemOffset") << itemOffset << m_header.size - sizeof(Item);
 | 
			
		||||
	if (itemOffset >= sizeof(Header) and
 | 
			
		||||
		 itemOffset < m_header.size - sizeof(Item) and
 | 
			
		||||
		 itemSpace >= static_cast<size_t>(sizeof(Item)) and
 | 
			
		||||
		 itemSpace >= item->fullSize()) {
 | 
			
		||||
		return ItemPtr(this, m_header.size, itemOffset, item->fullSize());
 | 
			
		||||
	} else {
 | 
			
		||||
		oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << itemOffset;
 | 
			
		||||
		return ItemPtr(this, m_header.size, 0, 0);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -271,7 +333,7 @@ struct __attribute__((packed)) Item {
 | 
			
		||||
			this->m_size = size;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		size_t size() const {
 | 
			
		||||
		virtual size_t size() const {
 | 
			
		||||
			return m_size;
 | 
			
		||||
		}
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								deps/ox/src/ox/ptrarith/ptr.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								deps/ox/src/ox/ptrarith/ptr.hpp
									
									
									
									
										vendored
									
									
								
							@@ -56,6 +56,10 @@ class Ptr {
 | 
			
		||||
 | 
			
		||||
		inline operator size_t() const;
 | 
			
		||||
 | 
			
		||||
		inline bool operator==(const Ptr<T, size_t, minOffset> &other) const;
 | 
			
		||||
 | 
			
		||||
		inline bool operator!=(const Ptr<T, size_t, minOffset> &other) const;
 | 
			
		||||
 | 
			
		||||
		template<typename SubT>
 | 
			
		||||
		inline const Ptr<SubT, size_t, sizeof(T)> subPtr(size_t offset, size_t size) const;
 | 
			
		||||
 | 
			
		||||
@@ -168,6 +172,20 @@ inline Ptr<T, size_t, minOffset>::operator size_t() const {
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T, typename size_t, size_t minOffset>
 | 
			
		||||
inline bool Ptr<T, size_t, minOffset>::operator==(const Ptr<T, size_t, minOffset> &other) const {
 | 
			
		||||
	return m_dataStart == other.m_dataStart &&
 | 
			
		||||
	       m_itemOffset == other.m_itemOffset &&
 | 
			
		||||
	       m_itemSize == other.m_itemSize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T, typename size_t, size_t minOffset>
 | 
			
		||||
inline bool Ptr<T, size_t, minOffset>::operator!=(const Ptr<T, size_t, minOffset> &other) const {
 | 
			
		||||
	return m_dataStart != other.m_dataStart ||
 | 
			
		||||
	       m_itemOffset != other.m_itemOffset ||
 | 
			
		||||
	       m_itemSize != other.m_itemSize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T, typename size_t, size_t minOffset>
 | 
			
		||||
template<typename SubT>
 | 
			
		||||
inline const Ptr<SubT, size_t, sizeof(T)> Ptr<T, size_t, minOffset>::subPtr(size_t offset, size_t size) const {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user