2012-11-29

аналог lock(C#) или @syncronized(ObjC) в С++

Типичное использование бустовских мютексов выглядит как

void SomeClass::SomeMethod() {
   //... some code
   {
      boost::mutex::scoped_lock lock(some_map_mutex_);
      some_map_.erase(foo);
   }
} 

Блок режет глаз и выглядит слегка чужеродно. Поэтому склепал вот такой вот велосипед

#define using_lock(mtx) for(::boost::mutex::scoped_lock lock(mtx), *flag = &lock; flag; flag = 0)

Использовать так


using_lock(some_map_mutex_) {
   some_map_.erase(foo);
}

2012-11-26

When ...

When I see three layers of weird DSLs for configuring a single app

When somebody says “it’s written in C, so it must be fast”

When somebody tries to explain JavaScript’s prototype system

When I hear your new PL doesn’t have exceptions and requires manual error handling instead

When somebody says he doesn’t like exceptions because he likes to handle errors where they appear

Moar here

2012-11-13

Интересная история о случае, когда в STL можно выстрелить себе в ногу. Когда хотели ускорить алгоритм, а в результате замедлили раз в сорок.
... есть благие намерения и известно, что требуются дополнительные приседания в виде преаллокации массива, но пуля прилетает туда же, куда и обычно. 

2012-11-06

Achtung, minen! или Shell + Space = @#$&

Работа шелла с пробелами иногда ни разу не интуитивна.

Дано
$ cat count.sh
echo "$# : '$1' '$2' '$3'"
$ cat proxy.sh
./count.sh $@
Пробуем
$ ./count.sh 'a b' c
2 'a b' 'c'
$ ./proxy.sh 'a b' c
3 'a' 'b' 'c'

Теперь я знаю, как это лечится ("$@"), но чем думал автор, когда делал такое поведение?