LINUX.ORG.RU

История изменений

Исправление 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 вершиной элегантности.