Parcourir la source

Adding arraynd skeleton

undefined
Guillaume Bittoun Sam Hocevar <sam@hocevar.net> il y a 10 ans
Parent
révision
64c714ed37
1 fichiers modifiés avec 93 ajouts et 0 suppressions
  1. +93
    -0
      src/lol/math/arraynd.h

+ 93
- 0
src/lol/math/arraynd.h Voir le fichier

@@ -0,0 +1,93 @@
//
// Lol Engine
//
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net>
// (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com>
// This program is free software; you can redistribute it and/or
// modify it under the terms of the Do What The Fuck You Want To
// Public License, Version 2, as published by Sam Hocevar. See
// http://www.wtfpl.net/ for more details.
//

//
// The arrayNd class
// -----------------
// A N-Dimensional array class allowing var[i][j][k]... indexing,
//

//
// FIXME: This file is in lol/math/ instead of lol/base/ because it
// uses ivec3.
//

#if !defined __LOL_MATH_ARRAYND_H__
#define __LOL_MATH_ARRAYND_H__

#include <lol/base/array.h>
#include <lol/base/assert.h>

namespace lol
{

template<size_t N, typename T1, typename T2 = void, typename T3 = void,
typename T4 = void, typename T5 = void, typename T6 = void,
typename T7 = void, typename T8 = void>
class arraynd : protected array<T1, T2, T3, T4, T5, T6, T7, T8>
{
public:
typedef array<T1, T2, T3, T4, T5, T6, T7, T8> super;
typedef typename super::element_t element_t;

inline arraynd() :
m_sizes()
{
}

inline arraynd(vec_t<size_t, N> sizes, element_t e = element_t()) :
m_sizes(sizes)
{
SetSize(m_sizes, e);
}

/* Access elements directly using an ivec3 index */
inline element_t const &operator [](ivec3 pos) const
{
return element_t(); // TODO
}

inline size_t ComputeTotalSize(vec_t<size_t, N> sizes)
{
size_t total_size = 1;

for (auto size : sizes)
total_size *= size;

return total_size;
}

/* Resize the array.
* FIXME: data gets scrambled; should we care? */
inline void SetSize(vec_t<size_t, N> sizes, element_t e = element_t())
{
this->Resize(ComputeTotalSize(sizes), e);
}

inline vec_t<size_t, N> GetSize() const
{
return ComputeTotalSize(this->m_sizes);
}

public:
inline element_t *Data() { return super::Data(); }
inline element_t const *Data() const { return super::Data(); }
inline int Count() const { return super::Count(); }
inline int Bytes() const { return super::Bytes(); }

private:
vec_t<size_t, N> m_sizes;
};

} /* namespace lol */

#endif // __LOL_MATH_ARRAYND_H__


Chargement…
Annuler
Enregistrer