Skip to content

celtera/ahsohtoa

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ahsohtoa - automatic AoS-to-SoA

C++ Sponsor License Platforms

Automatic structure-of-array generation for C++20: this library takes a structure such as:

struct Foo {
  int a;
  float b;
  struct Bar {
    float x;
    char y;
  } c;
};

and, given:

ahso::arrays<std::vector, Foo> storage_direct;

ahso::recursive_arrays<std::vector, Foo> storage_recursive;

will respectively synthesize types which look like:

// for storage_direct: 
std::tuple<std::vector<int>, std::vector<float>, std::vector<Bar>>

// for storage_recursive: 
std::tuple<std::vector<int>, std::vector<float>, std::vector<float>, std::vector<char>> 

Dependencies

  • Boost.PFR
  • C++20

Simple example

struct vec3 { float x,y,z; };
struct color { float r,g,b,a; };
struct physics_component {
  vec3 position;
  vec3 speed;
  vec3 acceleration;
};

struct render_component {
  color col;
};

struct entity {
  physics_component physics;
  render_component render;
}

int main()
{
  // Define our storage
  ahso::arrays<std::vector, entity> e;

  // Preallocate some space like you would with std::vector
  e.reserve(1000);

  // Add a new entity
  auto index = e.add_entity({
    .physics {
      .position { 0., 0., 0. }
    , .acceleration { 1., 0., 0. }
    },
    .render {
      .col { 0., 1., 0., 1. }
    }
  });

  // Access a specific component for entity "index"
  e.get<physics_component>(index).position.x = 2;
  
  // Or if the proper type is provided (until we get metaclasses, see example): 
  e[index].physics.position.x = 2;

  // Remove an entity
  e.erase(index);
}

Example with all the features

See https://github.com/celtera/ahsohtoa/blob/main/tests/test.cpp !

Licensing

The library is licensed under GPLv3 + commercial.