6 апр. 2010 г.

Как сломать vim шаблонной магией

Симптомы:
Пишу в vim'е  objname. в момент написания точки vim, консолька а потом и весь гуй повисают.
Жму Ctrl+Alt+F1 через ~минуту вижу черноту текстовой консоли. Логинюсь. Отстает даже ввод текста в текстовом терминале. Таки умудряюсь глянуть top, узреть что все сожрал именно vim. Снимаю его. Переключаюсь обратно в графику. Наступаю снова на те же грабли. Снова привожу все в порядок. Догадываюсь наконец что происходит. Добиваюсь своего :)

Что происходило:
Vim у меня настроен таким образом, что если сгенерированы теги, он пытается провернуть code completion. Точка после слова в cpp файле - один из триггеров. В коде шаманский рекурсивно определенный класс-шаблон вида:

tempate <class T>
class A: public A<T> {
 ...
};

template <>
class A<NullT> { 
};

Означенный объект как раз этого чудо-класса. Vim, пытаясь предложить возможные варианты уходит все глубже и глубже в это наследование, которое несчастному редактору кажется вечным, ведь в его обязанности не входит разбираться со специализациями. Хотя разрабы могли бы хоть ограничение на поиск воткнуть. Быть может соберусь с силами и починю vim :)
Такие дела.

5 апр. 2010 г.

Свежие альбомы Pagan'цев

Итак по порядку. Все ниже написанное ИМХО.

Butterfly Temple - Земля
Альбом хорош, если не сказать больше. Присутствуют "цепляющие" треки. "Смерть" вообще шедевр. 4,5 из 5.














Невидь - Янтарное сердце Арктиды
У меня очень противоречивые чувства относительно этого альбома. С одной стороны звучание стало другим, присутствуют довольно интересные моменты. А с другой - слишком тяжело, нету ничего похожего на "Ярым оком" или "Мокоши прядь храню". Нет даже лютого и бешеного драйва как в "Тени от сейдов" и "Зов новой гипербореи". (Совершенно непонятно почему). Звучание стало намного тяжелее, но нету драйва. Даже скучновато как-то, все наверно потому, что драйва мало. :)
Хотя есть и забавные моменты, только благодаря им и дослушал альбом до конца.

P.S.: Особо доставил следующий текст:

"Постой, не уходи, подруга!
В петлях не болтались мы,
В озорных объятиях друг друга
Не смотрели с мертвой высоты…

Птицы не клевали наши лица,
Ветер не раскачивал тела.
Это ж надо было умудриться-
Не узнать, как вянет голова!

Я и так уже давно без блеска,
Что играл в моих сухих глазах.
Нету в этой жизни интереса,
Кроме нежных слов в твоих устах…

Остальное все туман, пустое,
Головокружение в бреду…
Если счастье есть, оно простое -
Быть в петле с тобою на ветру…" 




Путь Солнца - Победитель всегда остается один
Отдельно хочется сказать, что обложка говно. И куда подевалось относительно вменяемое лого группы? 
Звук записан весьма годно. Но вокал звучит как-то "приклеено" и совсем не так яростно. Местами вокал блевотен. Вокал на "Эффекте бабочки" мне нравился куда больше. На концерте они забавнее чем в записи. =)

4 апр. 2010 г.

Template Magic Applied

Вот интересно что лучше: скрипт на Ruby, который генерирует:
    1 #ifndef __ENCODING__
    2 #define __ENCODING__
    3 
    4 template <typename T>
    5 struct encode_type {
    6     static const char code = '?';
    7 };
    8 
    9 template <typename T>
   10 struct encode_type<T *> {
   11     static const char code = '*';
   12 };
   13 
   14 template <>
   15 struct encode_type<char> {
   16     static const char code = 'c';
   17 };
   18 
   19 template <>
   20 struct encode_type<int> {
   21     static const char code = 'i';
   22 };
   23 
...

Или шаблонная магия:

    1 #include <cstdlib>
    2 #include <cstdio>
    3 #include <iostream>
    4 
    5 using namespace std;
    6 
    7 namespace Encodings {
    8  template <typename H, typename T>
    9  struct EL {
   10   typedef H Head;
   11   typedef T Tail;
   12  };
   13 
   14  template <typename T, char c>
   15  struct EP {
   16   typedef T Type;
   17   static const char code = c;
   18  };
   19 
   20  struct NullType;
   21 
   22  typedef EL<EP<int, 'i'>, EL<EP<char, 'c'>, EL<EP<float, 'f'>, EL<EP<double, 'd'>, EL<EP<bool, 'b'>, NullType> > > > > Encodings;
   23 
   24  template <typename List, typename T>
   25  struct EncFor {
   26   static const char result = 0;
   27  };
   28 
   29  template <typename T>
   30  struct EncFor<NullType, T> {
   31   static const char result = 0;
   32  };
   33 
   34  template <typename T, typename Tail, char c>
   35  struct EncFor<EL<EP<T, c>, Tail>, T> {
   36   static const char result = EP<T, c>::code;
   37  };
   38 
   39  template <typename T, typename Wrong, typename Tail, char c>
   40  struct EncFor<EL<EP<Wrong, c>, Tail>, T> {
   41   static const char result = EncFor<Tail, T>::result;
   42  };
   43 
   44  template <typename T>
   45  char encode_type(void) {
   46   return EncFor<Encodings, T>::result;
   47  }
   48 
   49  template <typename T>
   50  char encode_var_type(T t) {
   51   return encode_type<T>();
   52  }
   53 }
   54 
   55 int main(int argc, char **argv) {
   56  cout << Encodings::encode_type<int>() << endl;
   57 
   58  return EXIT_SUCCESS;
   59 }

Первое - проще осознать, проще дописать потом ещё тип, быстрее компилируется.
Второе - наркоманство, чтобы дописать ещё тип, надо осознать, долго компилируется. НО проще переделать все encoding'и, и нет внешнего генератора.
Мне больше нравится первый вариант, но отдельные личности против генерации кода внешней тулзой :( Интересно какой из вариантов попадет в release :)