- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
# define S_1(X,...) \
template<class T, int N> \
T X(const V<T, N>& v) \
{ \
return v.X; \
}
# define S_2(X,Y,...) \
template<class T, int N> \
V<T, 2> X##Y(const V<T, N>& v) \
{ \
return V<T, 2>(v.X, v.Y); \
}
# define S_3(X,Y,Z,...) \
template<class T, int N> \
V<T, 3> X##Y##Z(const V<T, N>& v) \
{ \
return V<T, 3>(v.X, v.Y, v.Z); \
}
# define S_4(X,Y,Z,W,...) \
template<class T, int N> \
V<T, 4> X##Y##Z##W(const V<T, N>& v) \
{ \
return V<T, 4>(v.X, v.Y, v.Z, v.W); \
}
# define S_E(S, X, Y, Z) \
S(x, X, Y, Z);S(y, X, Y, Z);S(z, X, Y, Z);S(w, X, Y, Z);S(O, X, Y, Z);S(I, X, Y, Z);
# define S_E1(E, S, Z, W) \
E(S, x, Z, W); \
E(S, y, Z, W); \
E(S, z, Z, W); \
E(S, w, Z, W); \
E(S, O, Z, W); \
E(S, I, Z, W);
# define S_E2(E, S, W) \
S_E1(E, S, x, W); \
S_E1(E, S, y, W); \
S_E1(E, S, z, W); \
S_E1(E, S, w, W); \
S_E1(E, S, O, W); \
S_E1(E, S, I, W);
# define S_E3(E, S) \
S_E2(E, S, x); \
S_E2(E, S, y); \
S_E2(E, S, z); \
S_E2(E, S, w); \
S_E2(E, S, O); \
S_E2(E, S, I);
S_E1(S_E, S_2, void, void);
S_E2(S_E, S_3, void);
S_E3(S_E, S_4);
// Где-то выше
template<class T, int N>
struct V;
template<class T>
struct V<T, 2>
{
V(T x, T y) : x(x), y(y) {}
T x,y;
T O = 0;
T I = 1;
};
template<class T>
struct V<T, 3>
{
V(T x, T y, T z) : x(x), y(y), z(z) {}
T x,y,z;
T O = 0;
T I = 1;
};
template<class T>
struct V<T, 4>
{
V(T x, T y, T z, T w) : x(x), y(y), z(z), w(w) {}
T x,y,z,w;
T O = 0;
T I = 1;
};
Этот код рабочий и используется во многих местах моего проекта.
Я его написал когда-то давно и уже забыл, как оно функционирует, но оно генерирует очень много (около 1.5k) функций.
P.S. Нахрена в каждом векторе нестатические поля O и I? Память же зря тратится на них, да и такты...
Поля ессно статические.
Статик отклеился при копировании сюда?
Ах да, надо не забыть удалить эти поля за ненадобностью...
http://ideone.com/Y8oaUh
Я не понял тольеко одного - нахуя?
Пересборка вектора из компонентов другого :)
Чтобы вместо V<float, 4>(v2.x, v2.y, 0.0, 1.0) писать X_Y_O_I(v2)
Я так понимаю, что ОП из геймдева, а там все эти сборки/разборки векторов актуальны.
P.S. Хотя... все 100500 вариантов, имхо, нафиг не нужны, по-любому будут юзать только (x, y) -> (x, y, 0, 1), (x, y, z, w) -> (x, y, z) и им подобные. А все эти варианты решились бы дополнительными конструкторами в V<>.
Я бы написал что то типа
GetFromVector(v2, "XYOI")
Парсить строку в горячих циклах? Да ты упоролся ;)
P.S. И как ты собрался определять тип возвращаемого значения по длине строки, чтобы GetFromVector(v2, "XY") возвращало двухкомпонентный вектор, а GetFromVector(v2, "XY01") - четырёх?
Ну а как ты будешь определять, что именно вернуть без парсинга этой строчки? Ну компилятор, скорее всего, сообразит, что там в аргументе константа, и все это заинлайнит и свернет... И асм даже может получиться таким же, как у ОП'а... Но проблему с переменной длиной ответа это не решает.
> Ну можно и енум
Как?
один ноль в вашу пользу, проклятые плюсы! )
И на плюсах можно stl использовать, там где подошёл бы обычный массив.
Как кегданское ФП, только полезное.
P.S. Did you mean "enter to the"?
Да, я тоже об этом подумал. Вообще, тут уже Boost.Geometry попахивает.
а, понял, 6^3 - для V<T, 3> и т.д
Если интересно - можно поглядеть на гитхабе.