no need for range namespace
no need for self_type anymore, c++11 has decltype
code style fix
no need to foce const there
use auto