История изменений
Исправление MOPKOBKA, (текущая версия) :
Например? С? Даже списки (<sys/queue.h>, например) реализованы через настолько жуткую макродичь, что туда смотреть не хочется ещё больше, чем в шаблоны.
Ты просто в C++ list не заглядывал, иначе бы посчитал sys/queue.h вершиной элегантности.
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
template<typename _Tp, typename _Alloc>
void _List_base<_Tp, _Alloc>:: _M_clear() _GLIBCXX_NOEXCEPT
{
typedef _List_node<_Tp> _Node;
__detail::_List_node_base* __cur = _M_impl._M_node._M_next;
while (__cur != &_M_impl._M_node)
{
_Node* __tmp = static_cast<_Node*>(__cur);
__cur = __tmp->_M_next;
_Tp* __val = __tmp->_M_valptr();
_Node_alloc_traits::destroy(_M_get_Node_allocator(), __val);
_M_put_node(__tmp);
}
}
template<typename _Tp, typename _Alloc>
template<typename... _Args>
typename list<_Tp, _Alloc>::iterator
list<_Tp, _Alloc>::
emplace(const_iterator __position, _Args&&... __args)
{
_Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
__tmp->_M_hook(__position._M_const_cast()._M_node);
this->_M_inc_size(1);
Какой прекрасный С++ код по сравнению с этим сишным нечитаемым монстром:
#define SLIST_FIRST(head) ((head)->slh_first)
#define SLIST_END(head) NULL
#define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
#define SLIST_FOREACH(var, head, field) \
for((var) = SLIST_FIRST(head); \
(var) != SLIST_END(head); \
(var) = SLIST_NEXT(var, field))
#define SLIST_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = SLIST_FIRST(head); \
(var) && ((tvar) = SLIST_NEXT(var, field), 1); \
(var) = (tvar))
Исправление MOPKOBKA, :
Например? С? Даже списки (<sys/queue.h>, например) реализованы через настолько жуткую макродичь, что туда смотреть не хочется ещё больше, чем в шаблоны.
Ты просто в C++ list не заглядывал, иначе бы посчитал sys/queue.h вершиной элегантности.
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
template<typename _Tp, typename _Alloc>
void _List_base<_Tp, _Alloc>:: _M_clear() _GLIBCXX_NOEXCEPT
{
typedef _List_node<_Tp> _Node;
__detail::_List_node_base* __cur = _M_impl._M_node._M_next;
while (__cur != &_M_impl._M_node)
{
_Node* __tmp = static_cast<_Node*>(__cur);
__cur = __tmp->_M_next;
_Tp* __val = __tmp->_M_valptr();
_Node_alloc_traits::destroy(_M_get_Node_allocator(), __val);
_M_put_node(__tmp);
}
}
template<typename _Tp, typename _Alloc>
template<typename... _Args>
typename list<_Tp, _Alloc>::iterator
list<_Tp, _Alloc>::
emplace(const_iterator __position, _Args&&... __args)
{
_Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
__tmp->_M_hook(__position._M_const_cast()._M_node);
this->_M_inc_size(1);
Какой прекрасный С++ код по сравнению с этим сишным нечитаемым монстром:
#define SLIST_FIRST(head) ((head)->slh_first)
#define SLIST_END(head) NULL
#define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
#define SLIST_FOREACH(var, head, field) \
for((var) = SLIST_FIRST(head); \
(var) != SLIST_END(head); \
(var) = SLIST_NEXT(var, field))
#define SLIST_FOREACH_SAFE(var, head, field, tvar) \
for ((var) = SLIST_FIRST(head); \
(var) && ((tvar) = SLIST_NEXT(var, field), 1); \
(var) = (tvar))
Исправление MOPKOBKA, :
Например? С? Даже списки (<sys/queue.h>, например) реализованы через настолько жуткую макродичь, что туда смотреть не хочется ещё больше, чем в шаблоны.
Ты просто в C++ list не заглядывал, иначе бы посчитал sys/queue.h вершиной элегантности.
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
template<typename _Tp, typename _Alloc>
void _List_base<_Tp, _Alloc>:: _M_clear() _GLIBCXX_NOEXCEPT
{
typedef _List_node<_Tp> _Node;
__detail::_List_node_base* __cur = _M_impl._M_node._M_next;
while (__cur != &_M_impl._M_node)
{
_Node* __tmp = static_cast<_Node*>(__cur);
__cur = __tmp->_M_next;
_Tp* __val = __tmp->_M_valptr();
_Node_alloc_traits::destroy(_M_get_Node_allocator(), __val);
_M_put_node(__tmp);
}
}
template<typename _Tp, typename _Alloc>
template<typename... _Args>
typename list<_Tp, _Alloc>::iterator
list<_Tp, _Alloc>::
emplace(const_iterator __position, _Args&&... __args)
{
_Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
__tmp->_M_hook(__position._M_const_cast()._M_node);
this->_M_inc_size(1);
Исходная версия MOPKOBKA, :
Например? С? Даже списки (<sys/queue.h>, например) реализованы через настолько жуткую макродичь, что туда смотреть не хочется ещё больше, чем в шаблоны.
Ты просто в C++ list не заглядывал, иначе бы посчитал sys/queue.h вершиной элегантности.