- 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) функций.
bormand 27.07.2014 13:51 # +2
P.S. Нахрена в каждом векторе нестатические поля O и I? Память же зря тратится на них, да и такты...
-Eugene- 04.08.2014 10:34 # +1
Поля ессно статические.
bormand 04.08.2014 10:49 # 0
Статик отклеился при копировании сюда?
-Eugene- 04.08.2014 10:53 # 0
Ах да, надо не забыть удалить эти поля за ненадобностью...
bormand 28.07.2014 07:48 # +2
http://ideone.com/Y8oaUh
kegdan 28.07.2014 07:52 # 0
Я не понял тольеко одного - нахуя?
bormand 28.07.2014 08:03 # 0
Пересборка вектора из компонентов другого :)
Чтобы вместо 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<>.
kegdan 28.07.2014 08:07 # 0
Я бы написал что то типа
GetFromVector(v2, "XYOI")
bormand 28.07.2014 08:07 # +1
Парсить строку в горячих циклах? Да ты упоролся ;)
P.S. И как ты собрался определять тип возвращаемого значения по длине строки, чтобы GetFromVector(v2, "XY") возвращало двухкомпонентный вектор, а GetFromVector(v2, "XY01") - четырёх?
kegdan 28.07.2014 08:09 # 0
bormand 28.07.2014 08:10 # 0
Ну а как ты будешь определять, что именно вернуть без парсинга этой строчки? Ну компилятор, скорее всего, сообразит, что там в аргументе константа, и все это заинлайнит и свернет... И асм даже может получиться таким же, как у ОП'а... Но проблему с переменной длиной ответа это не решает.
> Ну можно и енум
Как?
kegdan 28.07.2014 08:12 # 0
bormand 28.07.2014 08:12 # +3
kegdan 28.07.2014 08:14 # +3
один ноль в вашу пользу, проклятые плюсы! )
3.14159265 30.07.2014 15:03 # 0
И на плюсах можно stl использовать, там где подошёл бы обычный массив.
kegdan 30.07.2014 15:07 # 0
1024-- 28.07.2014 13:43 # +2
Как кегданское ФП, только полезное.
kegdan 28.07.2014 14:19 # +1
roman-kashitsyn 28.07.2014 14:07 # 0
bormand 28.07.2014 14:37 # 0
P.S. Did you mean "enter to the"?
bormand 28.07.2014 14:41 # 0
roman-kashitsyn 28.07.2014 14:56 # 0
roman-kashitsyn 28.07.2014 15:03 # 0
Да, я тоже об этом подумал. Вообще, тут уже Boost.Geometry попахивает.
-Eugene- 04.08.2014 10:35 # 0
TarasB 28.07.2014 18:38 # +1
bormand 28.07.2014 18:45 # 0
TarasB 28.07.2014 19:19 # 0
bormand 28.07.2014 19:25 # +2
kegdan 28.07.2014 20:38 # 0
а, понял, 6^3 - для V<T, 3> и т.д
eth0 28.07.2014 20:29 # 0
bormand 28.07.2014 21:29 # +1
Если интересно - можно поглядеть на гитхабе.
gost 29.07.2014 17:45 # 0
bormand 29.07.2014 18:37 # 0
eth0 30.07.2014 20:09 # 0
gammaker 04.08.2014 20:55 # 0
FadeToBlack 15.08.2014 19:02 # 0