psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2009-07-19 06:21 pm

Зодачка

Специально для любителей шОблоноф и прочих C++ наворотов. :) Сразу пердупердяю: задачка с подвохом.

Дано.

В программе есть некоторое количество классов, которые являются элементами односвязных списков с internal storage (проще говоря, это когда указатель на следующий элемент является членом класса).

Классы имеют вид:
class MyClass...
{
   MyClass *nextListItem;


Причем, варьируется не только название класса, но и название поля "nextListItem".

Задача.

Написать универсальную функцию вставки в начало списка с применением template, inline и pointer-to-member операторов. На входе должны быть: вставляемый элемент; указатель на первый элемент; название поля, указывающего на следующий элемент и тип класса. Функция может быть глобальной или членом namespace или функцией какого-либо нового класса - важно, чтобы она была одна, но работала для всех тех классов. Функция должна работать примерно так же, как ниже представленный #define:

#define INSERT_TO_LIST(firstItemPtr, item, nextItemName) \
(item)->nextItemName= (firstItemPtr), (firstItemPtr)= (item)


Посчитать количество строк в полученной функции. Факультативно: перечислить и обосновать преимущества перед приведенным #define.

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-19 03:06 pm (UTC)(link)
подписался на каменты.

[identity profile] afa-at-work.livejournal.com 2009-07-19 03:54 pm (UTC)(link)
гх.
а можно на рубях?
ну не люблю я статичную типизацию, да

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 06:38 am (UTC)(link)
на «динамических» языках не интересно, это кто угодно сделает.

алсо, чуть не забыл: руби — херня.

[identity profile] afa-at-work.livejournal.com 2009-07-20 06:42 am (UTC)(link)
holywar, holywar!
зато удобная херня, ага.
пысы. не, ну я мог смалтолку предложить... но эт уже издевательство было б

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 06:48 am (UTC)(link)
эй! ты весь холивар поломал! это я собирался сказать «не пишите на эрзацах, используйте православный smalltalk!» %-)

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 06:51 (UTC) - Expand

[identity profile] psilogic.livejournal.com 2009-07-20 07:25 am (UTC)(link)
Пролох и турбо про лох!

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 07:31 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 07:49 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 08:16 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 08:23 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 08:52 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 10:41 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 11:40 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 11:57 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 07:48 (UTC) - Expand

[identity profile] dii.livejournal.com 2009-07-19 06:49 pm (UTC)(link)
namespace ops
{

	template <class T>
	struct node_traits
	{
		typedef void undefined_next_member_ptr ;
		static undefined_next_member_ptr next_ptr() ;
	};

#define DECLARE_NEXT_PTR(className, nextNodeName) \
	template <> struct ::ops::node_traits<className> \
	{ \
		static className * className::*next_ptr() \
		{ \
			static className * className::* const t = &className::nextNodeName ; \
			return t ; \
		} \
	} ;


	template <class T>
	void prepend(T * &first_item, T * new_item)
	{
		T * T::* const next_item_name = node_traits<T>::next_ptr() ;
		new_item->*next_item_name= first_item ;
		first_item = new_item ;
	}

} // ops


struct node
{
	node(node * next = 0, int val = 0): next_(next), val_(val) {}
	node * next_ ;
	int val_ ;
} ;
DECLARE_NEXT_PTR(node, next_)


int main(array<System::String ^> ^args)
{
	node n1(0, 111) ;
	node n2(0, 222) ;

	node * p1 = &n1 ;
	node * p2 = &n2 ;

	ops::prepend(p2, p1) ;

	return 0;
}



Писанины, конечно, побольше :)
Но есть и преимущества:
- не нужно каждый раз писать название указателя на следующий член;
- значительное повышение вашей незаменимости для работодателя :)

[identity profile] psilogic.livejournal.com 2009-07-19 06:54 pm (UTC)(link)
это откуда ужасть такая? :)))))

[identity profile] dii.livejournal.com 2009-07-19 06:55 pm (UTC)(link)
из головы только что придумал

[identity profile] psilogic.livejournal.com 2009-07-19 07:03 pm (UTC)(link)
вы там поосторожнее с мухоморами :)))

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 06:39 am (UTC)(link)
O_O

с похмелюги почитал — гойлова ещё сильней заболела…

мм?

[identity profile] snusmumrikkk.livejournal.com 2009-07-19 07:12 pm (UTC)(link)
template
inline T* unshift(T* &list, T* item, T* T::*member)
{
	item->*member = list;
	return list = item;
}


Что я пропустил?

Re: мм?

[identity profile] snusmumrikkk.livejournal.com 2009-07-19 07:14 pm (UTC)(link)
Сорри, параметр шаблона — <class T>

Re: мм?

[identity profile] psilogic.livejournal.com 2009-07-19 07:21 pm (UTC)(link)
Практически идеально! А подвох "в уме" заметить, конечно, сложно. Дело в том, что по условию поле-указатель на следующий является private. Соответственно при попытке написать вызов этой функции (иначе как изнутри класса) компилятор ругнется матом :)

Re: мм?

[identity profile] snusmumrikkk.livejournal.com 2009-07-19 07:26 pm (UTC)(link)
У твоего макроса та же проблема по идее ;).
По-твоему ее можно решить? (не говори пока решение, если ты его знаешь)

Re: мм?

[identity profile] psilogic.livejournal.com 2009-07-19 07:40 pm (UTC)(link)
Да, у макроса та же ерунда. Единственный плюс: макрос хотя бы можно вызвать из функции класса MyClass. А эту функцию даже так не вызовешь. Совсем идеального решения я не знаю, неидеальных, но работающих приходит в голову много. Мне интересно, что ты предложишь.

Re: мм?

[identity profile] snusmumrikkk.livejournal.com - 2009-07-19 20:11 (UTC) - Expand

Re: мм?

[identity profile] psilogic.livejournal.com - 2009-07-19 20:36 (UTC) - Expand

Re: мм?

[identity profile] snusmumrikkk.livejournal.com - 2009-07-20 07:24 (UTC) - Expand

Re: мм?

[identity profile] psilogic.livejournal.com - 2009-07-20 07:47 (UTC) - Expand

Re: мм?

[identity profile] psilogic.livejournal.com - 2009-07-20 09:02 (UTC) - Expand

Re: мм?

[identity profile] snusmumrikkk.livejournal.com - 2009-07-20 09:29 (UTC) - Expand

Re: мм?

[identity profile] psilogic.livejournal.com - 2009-07-20 09:37 (UTC) - Expand

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 06:40 am (UTC)(link)
кстати сказать, если это код из «продакшына» — то кого-то надо больно убить. ибо все «списковые» классы надо наследовать от одной базы, и там иметь итераторы да все функции добавления/удаления.

[identity profile] snusmumrikkk.livejournal.com 2009-07-20 07:07 am (UTC)(link)
Необязательно от одной базы. Посмотрите на std::vector и std::list. У них даже методы добавления не симметричны. Вы уже хотите убить Степанова?

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:11 am (UTC)(link)
конечно. аффтара STL надо было в детстве на дубе повесить. страуструпа, впрочем, тоже.

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:11 am (UTC)(link)
я не знаю — надо пояснять, почему, или оно таки очевидно?
(deleted comment)

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 07:38 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 09:16 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 10:41 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 10:58 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:18 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 10:59 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:19 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:34 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:46 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:58 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 12:18 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 12:33 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 12:39 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-21 08:49 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-21 12:01 (UTC) - Expand

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:13 am (UTC)(link)
вдогон: массив != списку, так что пример некорректный.

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 07:28 (UTC) - Expand

[identity profile] psilogic.livejournal.com 2009-07-20 07:23 am (UTC)(link)
Нет, не из продакшена, это задачка. Задачка связана с реальными вещами, где наследовать от одной базы бесполезно. Прикинь, что будет, если элемент с internal storage лежит в нескольких списках. В wiki-статье говорится, что это невозможно, но это вполне возможно :)

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:26 am (UTC)(link)
это всё от безблагодатности. патамуша цпп — не иснтрумент для нормального программирования, увы.

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 07:30 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 07:37 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 07:46 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 08:21 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 08:51 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 08:59 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 09:13 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 09:33 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 09:42 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 09:47 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 09:54 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 10:44 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 10:52 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 10:54 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:01 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:21 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:36 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:54 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 11:59 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 12:16 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 12:01 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 12:22 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 12:37 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 09:00 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 09:15 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 10:47 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 12:00 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-20 13:51 (UTC) - Expand

(no subject)

[identity profile] afa-at-work.livejournal.com - 2009-07-21 07:11 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 09:05 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 09:17 (UTC) - Expand

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 09:23 (UTC) - Expand

[identity profile] http://technorati.com/people/technorati/ketmar (from livejournal.com) 2009-07-20 07:29 am (UTC)(link)
кстати, это возможно, но нахер не надо. архитектора бить молотком по гойлове, пока не поумнеет. или пока не выучит хотя бы слово «контейнер».

(no subject)

[identity profile] psilogic.livejournal.com - 2009-07-20 07:32 (UTC) - Expand