1. C++ / Говнокод #15964

    +13

    1. 1
    2. 2
    BOOST_PP_REPEAT(AMOUNT_OF_EMPLACE_CONSTRUCTOR_PARAMETER, GENERATE_EMPLACE_BACK, BOOST_PP_EMPTY()) 
    //Если видишь access violation, то это просто сработали ассерты. Вынеси их в отдельные функции для удобства отладки (см GENERATE_EMPLACE_BACK). Мне пока не понадобилось, а сейчас это делать лениво.

    Запостил: laMer007, 12 Мая 2014

    Комментарии (4) RSS

    • SEO не нужно.
      Ответить
    • А можно GENERATE_EMPLACE_BACK?
      Ответить
      • #define AMOUNT_OF_EMPLACE_CONSTRUCTOR_PARAMETER 10
        
        #define GENERATE_EMPLACE_BACK(_, ARG_COUNTER, __)								\
        	PP_FULL_TEMPLATE_ARGS(ARG_COUNTER)											\
        	void emplace_back( PP_FUNCTION_FORWARD_ARGS(ARG_COUNTER) )					\
        	{																			\
        		ASSERT(!this->full());/*Overflow*/										\
        		if(this->full())														\
        		return;/*throw std::out_of_range();*/								\
        		const size_type old_size=this->size();									\
        		size_type new_end;														\
        		if(this->m_end>=this->capacity())										\
        		new_end=0;															\
        		else																	\
        		new_end=this->m_end+1;												\
        		size_type creation_position;											\
        		if(new_end<this->m_begin)												\
        		creation_position=new_end;											\
        		else																	\
        		creation_position=this->m_end;										\
        		ASSERT(creation_position>=0);											\
        		ASSERT(new_end>=0);														\
        		ASSERT(creation_position<this->capacity());								\
        		ASSERT(new_end<=this->capacity());										\
        		\
        		const raw_array_iterator construct_position=this->raw_array_iterator_at(creation_position);\
        		ASSERT((char*)&*construct_position>=(char*)(this->m_raw_byte_array));	\
        		ASSERT((char*)&*construct_position<=(char*)(&(((T*)(&(this->m_raw_byte_array)))[this->capacity()-1])));\
        		::new(&*construct_position) value_type( PP_CALL_FUNCTION_FORWARD_ARGS(ARG_COUNTER) );\
        		\
        		this->m_end=new_end;													\
        		ASSERT((this->m_end==this->m_begin)==(this->size()==0));				\
        		ASSERT(old_size+1==this->size());										\
        		}
        Ответить

    Добавить комментарий