- 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
#include <iostream>
#include <cstring>
const char tag[] = "Secret tag!";
const size_t tagSize = sizeof(tag);
const size_t nameSize = 32;
template<class T>
struct Value
{
Value(const char* name, const T& data) :
data(data)
{
std::strncpy(this->tag, ::tag, tagSize);
std::strncpy(this->name, name, nameSize);
}
char tag[tagSize];
char name[nameSize];
T data;
};
int getStackDir()
{
char a;
char b;
return &b > &a ? 1 : -1;
}
template<class T>
T getValue(const char* name)
{
static const size_t stackSize = 1024 * 1024;
const int stackDir = getStackDir();
char begin;
for(char* p = &begin, *end = &begin - stackSize * stackDir; p != end; p -= stackDir)
{
Value<T>* value = (Value<T>*)p;
if(std::strcmp(value->tag, tag) != 0) continue;
if(std::strcmp(value->name, name) != 0) continue;
return value->data;
}
return T();
}
#define SET(type, name, value) Value<type> name(#name, value)
#define GET(type, name) getValue<type>(#name)
//-----------------------------------------------------------
void test()
{
std::cout << GET(int, x) << std::endl;
}
int main()
{
SET(int, x, 13);
test();
}
Xom94ok 13.05.2013 18:21 # +2
Ёбаный. Пиздец.
Lure Of Chaos 13.05.2013 18:24 # +6
Xom94ok 13.05.2013 18:59 # +3
bormand 13.05.2013 19:05 # +2
P.S. Если они хотят просто стек значений для какой-то переменной, то почему бы просто не сохранять его в RAIIшной переменной, а в ее деструкторе откатывать назад?
P.P.S. Ну или мапу из линкед листов или стеков, раз уж по именам доступ... Наверное старею я, раз мне подобные подходы уже не по душе, и хочется чего-то простого и понятного...
bormand 13.05.2013 19:15 # +2
P.S. Очень, очень, очень хрупкий код. Мне страшно представить, что будет, если компилятор переставит местами a и b (вроде бы ничего ему не мешает это сделать), или на стеке не будет подходящего value, и оно с шумом пролетающего паровоза улетит за границы стека...
P.P.S. И подобный идиотизм ведь отлично заменяется линкед листом из стековых структур...
Xom94ok 13.05.2013 21:40 # 0
P.S.
>>Я кстати так и не понял, что оно делает со стеком...
>>Наверное старею я
bormand скро-омничает, мимими :)
bormand 14.05.2013 05:33 # 0
LispGovno 14.05.2013 06:33 # +1
bormand 15.05.2013 12:09 # +1
defecate-plusplus 15.05.2013 13:57 # +1
bormand 13.05.2013 19:55 # +1
blackhearted 15.05.2013 11:49 # +1
bormand 15.05.2013 11:54 # +2
Да ну? Аргументируйте.
LispGovno 15.05.2013 11:59 # 0
Слышу тролля.
bormand 15.05.2013 12:08 # +2
Презумпция невиновности же. Хочешь сказать, что язык говно - изволь доказывать это сам. А начинать оправдывать лисп мне пока рано, т.к. оппонент не предъявил никакой аргументации, с которой было бы интересно поспорить.
LispGovno 15.05.2013 12:34 # −1
Мне лень говорить, поэтому не хочу.
3.14159265 15.05.2013 14:46 # +5
Это деепричастие?
Sh1tM4ker 13.05.2013 21:31 # −2
http://ideone.com/lhMlV8
Ну это если внутри других функций переменную не трогать
bormand 14.05.2013 05:12 # 0