use std::marker::PhantomData;
use tuple_traits::{Append, Contains};
mod flags {
pub struct Vertex;
pub struct MapRead;
}
struct Buffer<Flags> {
_flags: PhantomData<Flags>,
data: [u8; 512],
}
impl Buffer<()> {
pub fn new() -> Self {
Self {
_flags: PhantomData,
data: [0; 512],
}
}
}
impl<Flags> Buffer<Flags>
where
Flags: Append,
{
pub fn vertex_flag(self) -> Buffer<Flags::Append<flags::Vertex>> {
Buffer {
_flags: PhantomData,
data: self.data,
}
}
pub fn map_read_flag(self) -> Buffer<Flags::Append<flags::MapRead>> {
Buffer {
_flags: PhantomData,
data: self.data,
}
}
}
fn process_vertex_buffer<Flags, Index>(_buffer: &Buffer<Flags>)
where
Flags: Contains<flags::Vertex, Index>,
{
}
fn read_vertex_buffer<Flags, VertexIndex, MapReadIndex>(_buffer: &Buffer<Flags>)
where
Flags: Contains<flags::Vertex, VertexIndex> + Contains<flags::MapRead, MapReadIndex>,
{
}
fn main() {
let buffer: Buffer<()> = Buffer::new();
let buffer: Buffer<(flags::Vertex,)> = buffer.vertex_flag();
let buffer: Buffer<(flags::Vertex, flags::MapRead)> = buffer.map_read_flag();
process_vertex_buffer(&buffer);
read_vertex_buffer(&buffer);
}