<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0">
  <channel>
    <title>Форум 'Исходники' на RSDN.RU</title>
    <link>http://www.rsdn.ru/Forum/src/</link>
    <description>Поделитесь вашими исходниками с коллегами.</description>
    <category>src</category>
    <language>ru-ru</language>
    <copyright>Copyright ©, RSDN.ru, 2001-2007</copyright>
    <webMaster>webmaster@rsdn.ru</webMaster>
    <generator>RSDN RSS Generator 1.3</generator>
    <image>
      <url>http://www.rsdn.ru/rsdn.gif</url>
      <title>RSDN.RU</title>
      <link>http://www.rsdn.ru</link>
    </image>
    <lastBuildDate>Sun, 12 Feb 2012 20:01:34 GMT</lastBuildDate>
    <ttl>5</ttl>
	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rsdn/src" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="rsdn/src" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>C# API для Google Voice</title>
		<link>http://www.rsdn.ru/Forum/src/4585956.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4585956.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4585956.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4585956</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4585956.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4585956</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Не знал, в какой форум написать... Наверно сюда. Не бейте, если что.&lt;br /&gt;
&lt;br /&gt;
Мы написали API для гугл-войс (C#).&lt;br /&gt;
Open-source есесено.&lt;br /&gt;
Если кому понадобится &amp;mdash; то вот оно &lt;a href="https://bitbucket.org/jitbit/sharpgooglevoice/wiki/Home" class="m" target="_blank"&gt;https://bitbucket.org/jitbit/sharpgooglevoice/wiki/Home&lt;/a&gt; &lt;br /&gt;
Не счотите за рекламу.&lt;br /&gt;
&lt;br /&gt;
&lt;div class='mod'&gt;24.01.12 08:39: Перенесено модератором из '.NET' &amp;mdash; TK&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/Ws1VPjy9Ixs" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Sun, 22 Jan 2012 10:47:09 GMT</pubDate>
		
			<author>zi &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Reinforcement Learning Library</title>
		<link>http://www.rsdn.ru/Forum/src/4443369.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4443369.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4443369.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4443369</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4443369.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4443369</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Несколько лет назад писал диплом в универе на тему обучения с подкреплением. А именно разрабатывал библиотеку для создания таких систем. &lt;br /&gt;
Сейчас у меня чего-то проснулась тяга к науке, с++11 решил посмотреть и на работе проэкт какой-то не очень весёлый. Вообщем в свободное время реанимировал свою работу, практически полностью её переделал. Написал хоть какую-то документацию и наконец-то выложил в интернет. &lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/downloads/tarasko/rll/rll-0.1.tar.bz2" class="m" target="_blank"&gt;https://github.com/downloads/tarasko/rll/rll-0.1.tar.bz2&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/downloads/tarasko/rll/rll-0.1.7z" class="m" target="_blank"&gt;https://github.com/downloads/tarasko/rll/rll-0.1.7z&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Те кто хотя бы отдалённо знаком с этой темой, попробуйте качнуть и собрать. Там есть несколько простеньких примеров. Буду очень благодарен за отзывы. &lt;br /&gt;
Поскольку С++11, то собирать надо либо msvs 10 либо gcc &amp;gt;= 4.5.2&lt;br /&gt;
Заранее спасибо.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/6jMnlRyQX3s" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Tue, 04 Oct 2011 09:31:07 GMT</pubDate>
		
			<author>TarasKo &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>Macro recorder</title>
		<link>http://www.rsdn.ru/Forum/src/4377584.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4377584.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4377584.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4377584</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4377584.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4377584</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;&lt;a href="http://files.rsdn.ru/48064/Hook.rar" class="m" target="_blank"&gt;Macro recorder&lt;/a&gt;&lt;br /&gt;
Прога тестировалась минимально, проверок на ошибки почти нет, так что глюки не исключены.&lt;br /&gt;
&lt;br /&gt;
Должен быть установлен Python 2.6 и PyWin32, затем нужно скопировать pyHook.pth и папку pyHook в site-packages.&lt;br /&gt;
&lt;br /&gt;
Формат макросов в текстовом виде должен быть понятен из macros.txt. Могу заметить только, что есть два режима ввода нажатых клавиш: "сырой" &amp;mdash; &amp;lt;r+&amp;gt;, когда можно вводить только отображаемые клавиши и "обычный" &amp;mdash; &amp;lt;r-&amp;gt; (по умолчанию), когда можно вводить все, но с пробелами между ними. Пример:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&amp;lt;Name&amp;gt;for (Python)
&amp;lt;Shortcut&amp;gt;ctrl+alt+f
&amp;lt;Events&amp;gt;&amp;lt;r+&amp;gt;for i in range():&amp;lt;r-&amp;gt; enter tab

&amp;lt;Name&amp;gt;print (Python)
&amp;lt;Shortcut&amp;gt;ctrl+alt+p
&amp;lt;Events&amp;gt;&amp;lt;r+&amp;gt;print("&amp;lt;r-&amp;gt;ctrl+v : " , ctrl+v )&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Ввод нового макроса можно выполнить в текстовом виде, а можно с помощью хука:&lt;br /&gt;
ctrl+alt+F1 ShortcutKeys ctrl+alt+F2 MacroKeys ctrl+alt+F3.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/pjmH3y9V1mE" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Fri, 12 Aug 2011 12:46:06 GMT</pubDate>
		
			<author>DSblizzard &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>4</slash:comments>
		
	</item>

	<item>
		<title>Re: Kernel: Загрузка DLL из памяти (x86)</title>
		<link>http://www.rsdn.ru/Forum/src/4369347.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4369347.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4369347.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4369347</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4369347.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4369347</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Все же с LdrProcessRelocations есть проблемы.&lt;br /&gt;
На некоторых длл(с огромным сайзом RelocDirectory, напр. 2FXXX) крэшится, причем uRelocsSize уже почти доходит до нуля, т.е. в районе 0X100.&lt;br /&gt;
Это раз. А два, не кажется ли, что баг в вечном цикле, если pRelocBlock -&amp;gt; SizeOfBlock в общей сумме будет не равен uRelocsSize ? (Это уже другой вопрос, почемуу не равен, но uRelocsSize типа ULONG, он то всегда больше равен нулю)&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/WlEq3WNs3dQ" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Fri, 05 Aug 2011 11:28:15 GMT</pubDate>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>PDL: метод Destroy</title>
		<link>http://www.rsdn.ru/Forum/src/4332149.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4332149.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4332149.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4332149</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4332149.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4332149</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Добрый день!&lt;br /&gt;
&lt;br /&gt;
Вы писали:&lt;br /&gt;
&lt;blockquote class='q'&gt;&lt;p&gt;Представим себе, что плагин собран компилятором A, а основная программа, использующая его – компилятором B. Если мы загружаем класс из плагина, его экземпляр создаётся кодом, сгенерированным компилятором A. И если мы попытаемся удалить этот экземпляр из кода основной программы просто вызвав деструктор, то удалить его попытается код, сгенерированный компиляторов B. ... Чтобы избежать подобных проблем, деструктор ~DynamicClass() сделан защищённым, а вместо него следует вызывать метод DynamicClass::Destroy(). Это метод гарантирует, что память выделяется и освобождается из одной и той же кучи.&lt;/p&gt;&lt;/blockquote&gt;
&lt;br /&gt;
При этом&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
сlass DynamicClass
{
&lt;span class='kw'&gt;public&lt;/span&gt;:
  &lt;span class='kw'&gt;void&lt;/span&gt; Destroy() &lt;span class='kw'&gt;throw&lt;/span&gt;() { &lt;span class='kw'&gt;delete this&lt;/span&gt;; }
  ...
&lt;span class='kw'&gt;protected&lt;/span&gt;:
  &lt;span class='kw'&gt;virtual&lt;/span&gt; ~DynamicClass() &lt;span class='kw'&gt;throw&lt;/span&gt;() {;; }
};&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Но ведь реализация такого метода &lt;i&gt;Destroy()&lt;/i&gt; будет в коде основной программы, оттуда он вызывается и вызов &lt;i&gt;delete&lt;/i&gt; будет происходит тоже из нее, то есть как если бы мы прямо использовали &lt;i&gt;delete plugin&lt;/i&gt; в коде основной программы.&lt;br /&gt;
Мне кажется должно быть так:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
сlass DynamicClass
{
&lt;span class='kw'&gt;public&lt;/span&gt;:
  &lt;span class='kw'&gt;virtual void&lt;/span&gt; Destroy() = 0;
  ...
};

сlass MyPlugin : &lt;span class='kw'&gt;public&lt;/span&gt; DynamicClass
{
&lt;span class='kw'&gt;public&lt;/span&gt;:
  &lt;span class='kw'&gt;virtual void&lt;/span&gt; Destroy() { &lt;span class='kw'&gt;delete this&lt;/span&gt;; }
  ...
};&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Если я не прав, то поясните подробнее пожалуйста.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/fy8m2ADMnNA" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Wed, 06 Jul 2011 06:49:22 GMT</pubDate>
		
			<author>integer &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Компаратор</title>
		<link>http://www.rsdn.ru/Forum/src/4322315.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4322315.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4322315.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4322315</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4322315.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4322315</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Довольно часто приходится передавать IComparer&amp;lt;&amp;gt; в разные методы.&lt;br /&gt;
Для пользовательских классов приходится создавать класс, наследовать и т.п., да еще и хранить ссылку на экземпляр отдельно&lt;br /&gt;
чтобы то и дело не было создания.&lt;br /&gt;
Когда намного проще было бы написать лямбду "на месте".&lt;br /&gt;
Написал такой класс:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
    &lt;span class='kw'&gt;public class&lt;/span&gt; CustomComparer&amp;lt;T&amp;gt; : IComparer&amp;lt;T&amp;gt;
    {
        &lt;span class='kw'&gt;private readonly&lt;/span&gt; Func&amp;lt;T, T, &lt;span class='kw'&gt;int&lt;/span&gt;&amp;gt; comparer;
        
        &lt;span class='kw'&gt;private static&lt;/span&gt; CustomComparer&amp;lt;T&amp;gt; instance;

        &lt;span class='kw'&gt;public int&lt;/span&gt; Compare(T x, T y)
        {
           &lt;span class='kw'&gt;return&lt;/span&gt; comparer(x, y);
        }

        &lt;span class='kw'&gt;public&lt;/span&gt; CustomComparer(Func&amp;lt;T,T,&lt;span class='kw'&gt;int&lt;/span&gt;&amp;gt; comparer)
        {
            &lt;span class='kw'&gt;this&lt;/span&gt;.comparer = comparer;
        }

        &lt;span class='kw'&gt;static&lt;/span&gt; CustomComparer&amp;lt;T&amp;gt; Create(Func&amp;lt;T,T,&lt;span class='kw'&gt;int&lt;/span&gt;&amp;gt; comparer)
        {
            &lt;span class='kw'&gt;return&lt;/span&gt; instance ?? (instance = &lt;span class='kw'&gt;new&lt;/span&gt; CustomComparer&amp;lt;T&amp;gt;(comparer));
        }
    }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
юзать типа так:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
CustomComparer&amp;lt;Lalala&amp;gt;.Create((l1, l2) =&amp;gt; ...);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Думаю все понятно без комментариев.&lt;br /&gt;
Теперь вопрос: тыкните меня в стандартное решение из BCL, свой велосипед конечно самый крутой всегда, но все же я предпочитаю использовать стандартное апи. Или каждый сaм этот лесопед пишет?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class='mod'&gt;28.06.11 19:52: Перенесено модератором из '.NET' &amp;mdash; TK&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/DXwNq7c6gUk" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Mon, 27 Jun 2011 17:40:48 GMT</pubDate>
		
			<author>G-Host &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>19</slash:comments>
		
	</item>

	<item>
		<title>расширяем BOOST::preprocessor</title>
		<link>http://www.rsdn.ru/Forum/src/4310873.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4310873.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4310873.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4310873</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4310873.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4310873</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Предлагаю тут делиться недостающими в работе решениями для boost::preprocessor. Начну с себя:&lt;br /&gt;
&lt;br /&gt;
1) SWITCH на препроцессоре:&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								"Code"			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='com'&gt;//switch.......................................................................................................&lt;/span&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; DECLARE_CASE_TUPLE( key, seq ) ((key, seq))

&lt;span class='kw'&gt;#define&lt;/span&gt; __SWITCH_PRED(s, data, elem) BOOST_PP_EQUAL( BOOST_PP_TUPLE_ELEM(2,0,elem), data )

&lt;span class='kw'&gt;#define&lt;/span&gt; SWITCH( idx, switch_seq_result_idx, switch_seq ) \
    BOOST_PP_SEQ_ELEM(switch_seq_result_idx,BOOST_PP_TUPLE_ELEM(2,1, BOOST_PP_SEQ_ELEM(0,BOOST_PP_SEQ_FILTER(__SWITCH_PRED, idx, switch_seq))))&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								"Example"			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; MY_SWITCH() \
    DECLARE_CASE_TUPLE( 0, (a)(b)(c) ) \
    DECLARE_CASE_TUPLE( 1, (d)(e)(f) ) \
    DECLARE_CASE_TUPLE( 2, (g)(h)(j) )

SWITCH( 1, 2, MY_SWITCH()) &lt;span class='com'&gt;//f&lt;/span&gt;
SWITCH( 2, 0, MY_SWITCH()) &lt;span class='com'&gt;//g&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
&lt;br /&gt;
Недостатки. Нету обработки для DEFAULT. Её теоретически сделать не сложно. Но есть проблемы с варнингами. &lt;a href="http://www.rsdn.ru/forum/cpp.applied/4309598.aspx" title="SWITCH на препроцессоре (boost::preprocessor)" class=" tips m" rel="#m4309598" target="_blank"&gt;Подробности тут&lt;div class="tooltip" id="m4309598"&gt;Автор: nen777w&lt;br /&gt;Дата: 15.06.11&lt;/div&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2) Раширяем возможности BOOST_PP_SEQ_ENUM что бы перечисление можно было сделать не только через запятую:&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								"Code"			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='com'&gt;//seq enum ex..................................................................................................&lt;/span&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; _SEQ_ENUM_MACRO(r, data, elem) \
    BOOST_PP_CAT(elem, BOOST_PP_IF( BOOST_PP_EQUAL( BOOST_PP_DEC(r), BOOST_PP_SEQ_ELEM(0,data)), BOOST_PP_EMPTY(), BOOST_PP_SEQ_ELEM(1,data)))

&lt;span class='kw'&gt;#define&lt;/span&gt; SEQ_ENUM( seq, enum_separator ) \
    BOOST_PP_SEQ_FOR_EACH(_SEQ_ENUM_MACRO, (BOOST_PP_SEQ_SIZE(seq))(enum_separator), seq )&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								"Example"			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; SEQ() (a)(b)(c)
SEQ_ENUM( SEQ(), -&amp;gt; ) &lt;span class='com'&gt;//a-&amp;gt; b-&amp;gt; c&lt;/span&gt;

&lt;span class='kw'&gt;#define&lt;/span&gt; SEQ2() (a)
SEQ_ENUM( SEQ(), -&amp;gt; ) &lt;span class='com'&gt;//a&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
&lt;br /&gt;
3) Вот ещё отличный макрос от Vian &lt;a href="http://www.rsdn.ru/forum/src/2776152.aspx" title="[C++] Boost_1_34_1.Preprocessor/Update" class=" tips m" rel="#m2776152" target="_blank"&gt;[C++] Boost_1_34_1.Preprocessor/Update (BOOST_PP_MACRO_IF/BOOST_PP_MACRO_IIF)&lt;div class="tooltip" id="m2776152"&gt;Автор: Vain&lt;br /&gt;Дата: 22.12.07&lt;/div&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.rsdn.ru/forum/cpp/3932605.aspx" title="Как быть, если аргументы BOOST_PP_IF &amp;mdash; макросы?" class=" tips m" rel="#m3932605" target="_blank"&gt;Пример использования&lt;div class="tooltip" id="m3932605"&gt;Автор: enji&lt;br /&gt;Дата: 25.08.10&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/O-PfsQIB7mw" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Thu, 16 Jun 2011 13:23:25 GMT</pubDate>
		
			<author>nen777w &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>2</slash:comments>
		
	</item>

	<item>
		<title>nameof.Property</title>
		<link>http://www.rsdn.ru/Forum/src/4292453.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4292453.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4292453.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4292453</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4292453.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4292453</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Добрый день, господа.&lt;br /&gt;
&lt;br /&gt;
Хочу поделится классом, который я использую для типобезопасного взятия имени свойства.&lt;br /&gt;
&lt;br /&gt;
Для чего это нужно.&lt;br /&gt;
Основные области пременеия это выстрел события INotifyPropertyChanged.PropertyChanged и автоматические тесты.&lt;br /&gt;
&lt;br /&gt;
Чем лучше строковых переменных?&lt;br /&gt;
Первое, но не главное &amp;mdash; не ошибиться в написании имени свойства.&lt;br /&gt;
Второе и главное, при изменении имени свойства с помощью автоматического рефакторинга, не надо заботиться об соответствующем изменении строковых переменных.&lt;br /&gt;
&lt;br /&gt;
Чем хуже.&lt;br /&gt;
Производительность не высокая, не стоит использовать там, где будут тысячи запросов имени свойства в секунду.&lt;br /&gt;
&lt;br /&gt;
Есть два способа взять имя свойства&lt;br /&gt;
1. Когда есть только тип, имя свойства которого надо взять. &lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
nameof&amp;lt;Type&amp;gt;.Property( x =&amp;gt; x.Property );&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
2. Когда есть переменная нужного типа. &lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
nameof.Property( () =&amp;gt; variable.Property );&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Примеры использования:&lt;br /&gt;
&lt;br /&gt;
INotifyPropertyChanged &amp;mdash; второй способ, есть переменная this.&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
  &lt;span class='kw'&gt;class&lt;/span&gt; Presenter : INotifyPropertyChanged
  {
    &lt;span class='kw'&gt;private int&lt;/span&gt; _megaProperty;

    &lt;span class='kw'&gt;public int&lt;/span&gt; MegaProperty
    {
      &lt;span class='kw'&gt;get&lt;/span&gt; { &lt;span class='kw'&gt;return&lt;/span&gt; _megaProperty; }
      &lt;span class='kw'&gt;set&lt;/span&gt;
      {
        _megaProperty = &lt;span class='kw'&gt;value&lt;/span&gt;;
        RaisePropertyChanged( &lt;b&gt;nameof.Property(() =&amp;gt; MegaProperty)&lt;/b&gt; );
      }
    }

    &lt;span class='kw'&gt;private void&lt;/span&gt; RaisePropertyChanged(&lt;span class='kw'&gt;string&lt;/span&gt; propertyName)
    {
      PropertyChanged(&lt;span class='kw'&gt;this&lt;/span&gt;, &lt;span class='kw'&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));
    }

    &lt;span class='kw'&gt;public event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
  }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В тестах (приведены тесты nunit) используются оба&lt;br /&gt;
&lt;br /&gt;
1.&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
Assert.That(presenter.Items, Is.All.Property( &lt;b&gt;nameof&amp;lt;NodeType&amp;gt;.Property(x =&amp;gt; x.Name)&lt;/b&gt; ).StartsWith(&lt;span class='str'&gt;"123"&lt;/span&gt;));
Assert.That(nodes, Is.Ordered.By( &lt;b&gt;nameof&amp;lt;NodeType&amp;gt;.Property(n =&amp;gt; n.Name)&lt;/b&gt; ));&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
2.&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
eventExpectator.AssertWasCalled(h =&amp;gt; h.Invoke(Arg&amp;lt;&lt;span class='kw'&gt;object&lt;/span&gt;&amp;gt;.Is.Anything, Arg&amp;lt;PropertyChangedEventArgs&amp;gt;.Matches(args =&amp;gt;
   args.PropertyName == &lt;b&gt;nameof.Property(() =&amp;gt; presenter.Items)&lt;/b&gt;)), &lt;span class='kw'&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Собственно код классов&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
  &lt;span class='kw'&gt;public static class&lt;/span&gt; nameof
  {
    &lt;span class='kw'&gt;public static string&lt;/span&gt; Property&amp;lt; TV &amp;gt;( Expression&amp;lt; Func&amp;lt; TV &amp;gt; &amp;gt; &lt;span class='kw'&gt;property&lt;/span&gt; )
    {
      &lt;span class='kw'&gt;var&lt;/span&gt; body = &lt;span class='kw'&gt;property&lt;/span&gt;.Body &lt;span class='kw'&gt;as&lt;/span&gt; MemberExpression;
        &lt;span class='kw'&gt;if&lt;/span&gt;(body == &lt;span class='kw'&gt;null&lt;/span&gt;)
            &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentException(&lt;span class='str'&gt;"'expression' should be a member expression"&lt;/span&gt;);
        &lt;span class='kw'&gt;return&lt;/span&gt; body.Member.Name;
    }
  }

  &lt;span class='kw'&gt;public static class&lt;/span&gt; nameof&amp;lt; T &amp;gt;
  {
    &lt;span class='kw'&gt;public static string&lt;/span&gt; Property&amp;lt; TV &amp;gt;( Expression&amp;lt; Func&amp;lt; T, TV &amp;gt; &amp;gt; &lt;span class='kw'&gt;property&lt;/span&gt; )
    {
       &lt;span class='kw'&gt;var&lt;/span&gt; body = &lt;span class='kw'&gt;property&lt;/span&gt;.Body &lt;span class='kw'&gt;as&lt;/span&gt; MemberExpression;
        &lt;span class='kw'&gt;if&lt;/span&gt;(body == &lt;span class='kw'&gt;null&lt;/span&gt;)
            &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentException(&lt;span class='str'&gt;"'expression' should be a member expression"&lt;/span&gt;);
        &lt;span class='kw'&gt;return&lt;/span&gt; body.Member.Name;
    }
  }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
надеюсь кому-нибудь пригодится&lt;br /&gt;
&lt;br /&gt;
Ed.ward&lt;br /&gt;
&lt;br /&gt;
&lt;div class='mod'&gt;31.05.11 11:30: Перенесено из '.NET'&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/i2n9TEyU-Io" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Mon, 30 May 2011 13:30:04 GMT</pubDate>
		
			<author>Ed.ward &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Управление сетью</title>
		<link>http://www.rsdn.ru/Forum/src/4278756.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4278756.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4278756.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4278756</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4278756.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4278756</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Что делать с программой?&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://sysadminblog.ru/sydkit/2010/06/03/upravlenie-it-infrastrukturoy-i-ee-monitoring-delaem-po-sami.html" class="m" target="_blank"&gt;http://sysadminblog.ru/sydkit/2010/06/03/upravlenie-it-infrastrukturoy-i-ee-monitoring-delaem-po-sami.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Ранее я уже писал о своем проекте подвисшем на уровне беты. Попробую выложить бету для тестирования, разного рода пожелания, багрепорты, советы и прочее крайне приветствуется.&lt;br /&gt;
Прогу назвал SyDkit (от SysaDminkit), предназначается для управления сетевой инфраструктурой малый и средних организаций.&lt;br /&gt;
Возможности программы:&lt;br /&gt;
— Мониторинг мониторинг сетевых устройств. Пока используется только ping, доступность портов по tcp добавлю позже;&lt;br /&gt;
— Скриптовый движок для выполнения рутинных операций, например резервного копирования конфига с cisco или автоматического логина на любой девайс;&lt;br /&gt;
— Встроенный telnet клиент. Пока притормаживает, но разберусь в чем дело;&lt;br /&gt;
— Встроенные утилиты ping, tracert, whois, lancalc собственной разработки;&lt;br /&gt;
— Возможность подключения к девайсу в 2 клика по заранее настроенному сценарию подключения;&lt;br /&gt;
— Хранение неограниченного количества схем, возможность быстрого перехода между ними;&lt;br /&gt;
— Снятие статистики по SNMP, пока заготовленный набор параметров, позже добавлю самостоятельную настройку;&lt;br /&gt;
— Хранение RDP сценариев входа на сервера;&lt;br /&gt;
— Встроенный TFTP клиент с раскладыванием полученных файлов от девайсов по папкам;&lt;br /&gt;
&lt;br /&gt;
Есть тут советчики?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/Gyf8Q2FK014" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Fri, 20 May 2011 09:54:10 GMT</pubDate>
		
			<author>Viman &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Кросплатформенный вариант string2int</title>
		<link>http://www.rsdn.ru/Forum/src/4253262.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4253262.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4253262.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4253262</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4253262.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4253262</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Вот еще один вариант в тему сабжа без atoi и  strtol&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;int&lt;/span&gt; val =0 ;
std::istringstream i_str(index.c_str());
i_str &amp;gt;&amp;gt; val;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/k_Rt4BtNZ0o" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Fri, 29 Apr 2011 07:30:27 GMT</pubDate>
		
			<author>b099ard &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>[C#] Natural string comparison</title>
		<link>http://www.rsdn.ru/Forum/src/4231334.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4231334.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4231334.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4231334</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4231334.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4231334</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Погуглил немного готовые реализации &amp;mdash; ужас какие неэффективные! Пришлось набросать свою, там всего-то пара строк кода, но вдруг кому-то пригодится.&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
[TestFixture]
&lt;span class='kw'&gt;public class&lt;/span&gt; NaturalComparerTest
{
   &lt;span class='kw'&gt;readonly&lt;/span&gt; NaturalComparer cmp = &lt;span class='kw'&gt;new&lt;/span&gt; NaturalComparer();

   [Test]
   [TestCase(&lt;span class='kw'&gt;null&lt;/span&gt;, &lt;span class='str'&gt;""&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;""&lt;/span&gt;, &lt;span class='str'&gt;"a"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"a"&lt;/span&gt;, &lt;span class='str'&gt;"aa"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"3"&lt;/span&gt;, &lt;span class='str'&gt;"4"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"3"&lt;/span&gt;, &lt;span class='str'&gt;"34"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"3"&lt;/span&gt;, &lt;span class='str'&gt;"a"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"a3"&lt;/span&gt;, &lt;span class='str'&gt;"a4"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"a3"&lt;/span&gt;, &lt;span class='str'&gt;"b3"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"a34"&lt;/span&gt;, &lt;span class='str'&gt;"a34b"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"AK47"&lt;/span&gt;, &lt;span class='str'&gt;"AK74"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"I-9"&lt;/span&gt;, &lt;span class='str'&gt;"I-10"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"5-out-of-8"&lt;/span&gt;, &lt;span class='str'&gt;"5-out-of-20"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"5-out-of-8-apples"&lt;/span&gt;, &lt;span class='str'&gt;"5-out-of-20-apples"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"episode-1-part-1"&lt;/span&gt;, &lt;span class='str'&gt;"episode-1-part-2"&lt;/span&gt;)]
   &lt;span class='kw'&gt;public void&lt;/span&gt; TestLess(&lt;span class='kw'&gt;string&lt;/span&gt; x, &lt;span class='kw'&gt;string&lt;/span&gt; y)
   {
      Assert.IsTrue(cmp.Compare(x, y) &amp;lt; 0);
   }

   [Test]
   [TestCase(&lt;span class='kw'&gt;null&lt;/span&gt;, &lt;span class='kw'&gt;null&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;""&lt;/span&gt;, &lt;span class='str'&gt;""&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"a"&lt;/span&gt;, &lt;span class='str'&gt;"a"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"4"&lt;/span&gt;, &lt;span class='str'&gt;"4"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"43"&lt;/span&gt;, &lt;span class='str'&gt;"43"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"a-43"&lt;/span&gt;, &lt;span class='str'&gt;"a-43"&lt;/span&gt;)]
   [TestCase(&lt;span class='str'&gt;"43-a-34"&lt;/span&gt;, &lt;span class='str'&gt;"43-a-34"&lt;/span&gt;)]
   &lt;span class='kw'&gt;public void&lt;/span&gt; TestEqual(&lt;span class='kw'&gt;string&lt;/span&gt; x, &lt;span class='kw'&gt;string&lt;/span&gt; y)
   {
      Assert.AreEqual(0, cmp.Compare(x, y));
   }
}


&lt;span class='kw'&gt;public class&lt;/span&gt; NaturalComparer : IComparer&amp;lt;&lt;span class='kw'&gt;string&lt;/span&gt;&amp;gt;
{
   &lt;span class='kw'&gt;public int&lt;/span&gt; Compare(&lt;span class='kw'&gt;string&lt;/span&gt; x, &lt;span class='kw'&gt;string&lt;/span&gt; y)
   {
      &lt;span class='kw'&gt;if&lt;/span&gt; (x == &lt;span class='kw'&gt;null&lt;/span&gt; &amp;amp;&amp;amp; y == &lt;span class='kw'&gt;null&lt;/span&gt;) &lt;span class='kw'&gt;return&lt;/span&gt; 0;
      &lt;span class='kw'&gt;if&lt;/span&gt; (x == &lt;span class='kw'&gt;null&lt;/span&gt;) &lt;span class='kw'&gt;return&lt;/span&gt; -1;
      &lt;span class='kw'&gt;if&lt;/span&gt; (y == &lt;span class='kw'&gt;null&lt;/span&gt;) &lt;span class='kw'&gt;return&lt;/span&gt; 1;

      &lt;span class='kw'&gt;int&lt;/span&gt; lx = x.Length, ly = y.Length;

      &lt;span class='kw'&gt;for&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt; mx = 0, my = 0; mx &amp;lt; lx &amp;amp;&amp;amp; my &amp;lt; ly; mx++, my++)
      {
         &lt;span class='kw'&gt;if&lt;/span&gt; (&lt;span class='kw'&gt;char&lt;/span&gt;.IsDigit(x[mx]) &amp;amp;&amp;amp; &lt;span class='kw'&gt;char&lt;/span&gt;.IsDigit(y[my]))
         {
            &lt;span class='kw'&gt;long&lt;/span&gt; vx = 0, vy = 0;

            &lt;span class='kw'&gt;for&lt;/span&gt; (; mx &amp;lt; lx &amp;amp;&amp;amp; &lt;span class='kw'&gt;char&lt;/span&gt;.IsDigit(x[mx]); mx++)
               vx = vx * 10 + x[mx] - &lt;span class='str'&gt;'0'&lt;/span&gt;;

            &lt;span class='kw'&gt;for&lt;/span&gt; (; my &amp;lt; ly &amp;amp;&amp;amp; &lt;span class='kw'&gt;char&lt;/span&gt;.IsDigit(y[my]); my++)
               vy = vy * 10 + y[my] - &lt;span class='str'&gt;'0'&lt;/span&gt;;

            &lt;span class='kw'&gt;if&lt;/span&gt; (vx != vy)
               &lt;span class='kw'&gt;return&lt;/span&gt; vx &amp;gt; vy ? 1 : -1;
         }

         &lt;span class='kw'&gt;if&lt;/span&gt; (mx &amp;lt; lx &amp;amp;&amp;amp; my &amp;lt; ly &amp;amp;&amp;amp; x[mx] != y[my])
            &lt;span class='kw'&gt;return&lt;/span&gt; x[mx] &amp;gt; y[my] ? 1 : -1;
      }

      &lt;span class='kw'&gt;return&lt;/span&gt; lx - ly;
   }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/EtYi0qw817M" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Tue, 12 Apr 2011 23:19:39 GMT</pubDate>
		
			<author>Andy77 &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>Tuple для C++</title>
		<link>http://www.rsdn.ru/Forum/src/4218954.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4218954.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4218954.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4218954</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4218954.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4218954</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Вчера совершенно случайно начали обсуждать tuple и их реализацию в С++, может они шутили, но я занялся и вот что получилось.&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='com'&gt;// MSV Lib. Tuple. 2011.04.01 21:60&lt;/span&gt;

&lt;span class='kw'&gt;#define&lt;/span&gt; TPLM Tuple(TPLMOVE) + 
&lt;span class='kw'&gt;#define&lt;/span&gt; TPLC Tuple(TPLCOPY) + 
&lt;span class='kw'&gt;#define&lt;/span&gt; TPL Tuple() + 
&lt;span class='com'&gt;//#define GTPL Tuple() +&lt;/span&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; TPLERROR(t) { memcpy(0, 0, 1); }

&lt;span class='kw'&gt;#define&lt;/span&gt; TPLMOVE    1 &lt;span class='com'&gt;// copy to tuple, memset 0 original. = destruct dest, copy to dest.&lt;/span&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; TPLCOPY    2 &lt;span class='com'&gt;// copy constructor = destruct dest, copy to dest&lt;/span&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; TPLGET    3 &lt;span class='com'&gt;// destruct all values :)&lt;/span&gt;

&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;memory.h&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;math.h&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;stdio.h&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;typeinfo&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;string.h&amp;gt;

&lt;span class='kw'&gt;#define&lt;/span&gt; max(a, b) (((a) &amp;gt; (b)) ? (a) : (b))
&lt;span class='kw'&gt;#define&lt;/span&gt; min(a, b) (((a) &amp;lt; (b)) ? (a) : (b))

&lt;span class='kw'&gt;unsigned int&lt;/span&gt; mcrc(&lt;span class='kw'&gt;char&lt;/span&gt;* name, &lt;span class='kw'&gt;unsigned int&lt;/span&gt; sz){
    &lt;span class='kw'&gt;unsigned int&lt;/span&gt; ret=0; &lt;span class='kw'&gt;if&lt;/span&gt;(!sz) sz=(&lt;span class='kw'&gt;unsigned int&lt;/span&gt;)strlen(name);
    &lt;span class='kw'&gt;char&lt;/span&gt;*t=name+sz; &lt;span class='kw'&gt;int&lt;/span&gt; p=0;
    &lt;span class='kw'&gt;while&lt;/span&gt;(name&amp;lt;t){
        *(((&lt;span class='kw'&gt;char&lt;/span&gt;*)&amp;amp;ret)+p)+=*name; p++;
        &lt;span class='kw'&gt;if&lt;/span&gt;(p&amp;gt;=4) p=0; name++;
    }
&lt;span class='kw'&gt;return&lt;/span&gt; ret;
}

&lt;span class='kw'&gt;struct&lt;/span&gt; Tupled{ &lt;span class='kw'&gt;unsigned int&lt;/span&gt; sz, type; &lt;span class='kw'&gt;void&lt;/span&gt; *v; &lt;span class='kw'&gt;char&lt;/span&gt; data[0]; };

&lt;span class='kw'&gt;class&lt;/span&gt; Tuple{
    &lt;span class='kw'&gt;int&lt;/span&gt; count, set, dusz, dasz;
    &lt;span class='kw'&gt;unsigned char&lt;/span&gt; *data;
    &lt;span class='kw'&gt;int&lt;/span&gt; type; &lt;span class='kw'&gt;int&lt;/span&gt; adel; 

&lt;span class='kw'&gt;public&lt;/span&gt;:
    Tuple(){ count=0; set=0; type=0; dusz=0; dasz=0; data=0; adel=0; }
    Tuple(&lt;span class='kw'&gt;int&lt;/span&gt; t){ type=t; }

    ~Tuple(){ &lt;span class='kw'&gt;if&lt;/span&gt;(count!=set) TPLERROR(&lt;span class='str'&gt;"~Tuple"&lt;/span&gt;); &lt;span class='kw'&gt;delete&lt;/span&gt; data; }

    Tuple(Tuple &amp;amp;t){
        count=t.count; set=t.set; dusz=t.dusz; dasz=t.dasz; data=t.data;
        t.count=0; t.set=0; t.data=0; adel=1;
    }

    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    Tuple&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;+(T &amp;amp;t){ &lt;span class='kw'&gt;if&lt;/span&gt;(!adel) Add(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;else&lt;/span&gt; Del(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;; }
    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    Tuple&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;-(T &amp;amp;t){ &lt;span class='kw'&gt;if&lt;/span&gt;(!adel) Add(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;else&lt;/span&gt; Del(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;; }
    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    Tuple&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;*(T &amp;amp;t){ &lt;span class='kw'&gt;if&lt;/span&gt;(!adel) Add(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;else&lt;/span&gt; Del(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;; }
    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    Tuple&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;/(T &amp;amp;t){ &lt;span class='kw'&gt;if&lt;/span&gt;(!adel) Add(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;else&lt;/span&gt; Del(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;; }
    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    Tuple&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;,(T &amp;amp;t){ &lt;span class='kw'&gt;if&lt;/span&gt;(!adel) Add(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;else&lt;/span&gt; Del(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;; }
    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    Tuple&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;&amp;gt;(T &amp;amp;t){ &lt;span class='kw'&gt;if&lt;/span&gt;(!adel) Add(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;else&lt;/span&gt; Del(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;; }
    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    Tuple&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; &amp;lt;(T &amp;amp;t){ &lt;span class='kw'&gt;if&lt;/span&gt;(!adel) Add(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;else&lt;/span&gt; Del(&amp;amp;t, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(t), t); &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;; }

    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    &lt;span class='kw'&gt;void&lt;/span&gt; Add(&lt;span class='kw'&gt;void&lt;/span&gt; *v, &lt;span class='kw'&gt;int&lt;/span&gt; s, T &amp;amp;t){
        &lt;span class='kw'&gt;if&lt;/span&gt;(dasz-dusz&amp;lt;s+4+(&lt;span class='kw'&gt;int&lt;/span&gt;)&lt;span class='kw'&gt;sizeof&lt;/span&gt;(&lt;span class='kw'&gt;void&lt;/span&gt;*)){
            &lt;span class='kw'&gt;unsigned char&lt;/span&gt; *ldata=data;
            data=&lt;span class='kw'&gt;new unsigned char&lt;/span&gt;[dasz+max(128, s+4)];
            memcpy(data, ldata, dasz);
            dasz+=max(128, s);                    
            &lt;span class='kw'&gt;delete&lt;/span&gt; [] ldata;
        }
        Tupled &amp;amp;d=*(Tupled*)(data+dusz);
        d.sz=s;
        memcpy(&amp;amp;d.v, v, &lt;span class='kw'&gt;sizeof&lt;/span&gt;(&lt;span class='kw'&gt;void&lt;/span&gt;*));
        &lt;span class='kw'&gt;if&lt;/span&gt;(type==TPLCOPY){ *(T*)d.data=t; } &lt;span class='kw'&gt;else&lt;/span&gt; memcpy(d.data, v, s);
        &lt;span class='kw'&gt;if&lt;/span&gt;(type==TPLMOVE) t.~T();

        d.type=mcrc((&lt;span class='kw'&gt;char&lt;/span&gt;*)&lt;span class='kw'&gt;typeid&lt;/span&gt;(t).name(), 0);
        dusz+=&lt;span class='kw'&gt;sizeof&lt;/span&gt;(Tupled)+s; count++;
    }

    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;class&lt;/span&gt; T&amp;gt;
    &lt;span class='kw'&gt;void&lt;/span&gt; Del(&lt;span class='kw'&gt;void&lt;/span&gt; *v, &lt;span class='kw'&gt;int&lt;/span&gt; s, T &amp;amp;t){
        &lt;span class='kw'&gt;if&lt;/span&gt;(set&amp;gt;=count){ TPLERROR(&lt;span class='str'&gt;"Tuple::Set"&lt;/span&gt;); &lt;span class='kw'&gt;return&lt;/span&gt; ; }
        &lt;span class='kw'&gt;unsigned char&lt;/span&gt; *p=GetData(set);
        &lt;span class='kw'&gt;if&lt;/span&gt;(!p){ TPLERROR(&lt;span class='str'&gt;"Tuple::NoData"&lt;/span&gt;); &lt;span class='kw'&gt;return&lt;/span&gt; ; }

        Tupled &amp;amp;d=*(Tupled*)p;
        &lt;span class='kw'&gt;unsigned int&lt;/span&gt; tp=mcrc((&lt;span class='kw'&gt;char&lt;/span&gt;*)&lt;span class='kw'&gt;typeid&lt;/span&gt;(t).name(), 0);
        &lt;span class='kw'&gt;if&lt;/span&gt;(tp!=d.type){ TPLERROR(&lt;span class='str'&gt;"Tuple::TYPE"&lt;/span&gt;); &lt;span class='kw'&gt;return&lt;/span&gt; ;}

        t.~T();
        &lt;span class='kw'&gt;if&lt;/span&gt;(d.sz!=s){ TPLERROR(&lt;span class='str'&gt;"Tuple::SIZE"&lt;/span&gt;); &lt;span class='kw'&gt;return&lt;/span&gt; ;}
        memcpy(v, d.data, d.sz);
        
        set++;
    }

    &lt;span class='kw'&gt;unsigned char&lt;/span&gt;* GetData(&lt;span class='kw'&gt;int&lt;/span&gt; c){
        &lt;span class='kw'&gt;if&lt;/span&gt;(c&amp;gt;=count) &lt;span class='kw'&gt;return&lt;/span&gt; 0;
        &lt;span class='kw'&gt;unsigned char&lt;/span&gt; *p=data;
        &lt;span class='kw'&gt;for&lt;/span&gt;(&lt;span class='kw'&gt;int&lt;/span&gt; i=0; i&amp;lt;c; i++){
            p+=&lt;span class='kw'&gt;sizeof&lt;/span&gt;(Tupled)+*(&lt;span class='kw'&gt;int&lt;/span&gt;*)p;
        }
        &lt;span class='kw'&gt;return&lt;/span&gt; p;
    }
};

Tuple T(){ &lt;span class='kw'&gt;int&lt;/span&gt; i=1, j=2, k=3; &lt;span class='kw'&gt;return&lt;/span&gt; TPL i, j, k; }
&lt;span class='kw'&gt;int&lt;/span&gt; T2(Tuple t){
    &lt;span class='kw'&gt;int&lt;/span&gt; a, b, c;
    t, a, b, c;
    printf(&lt;span class='str'&gt;" T2: %d %d %d"&lt;/span&gt;, a, b, c);
    &lt;span class='kw'&gt;return&lt;/span&gt; 1;
}

&lt;span class='kw'&gt;int&lt;/span&gt; main(){
    &lt;span class='kw'&gt;int&lt;/span&gt; a, b, c;
    T(), a, b, c;
    printf(&lt;span class='str'&gt;"%d %d %d"&lt;/span&gt;, a, b, c);
    T2(TPL a + b + c);
    &lt;span class='kw'&gt;return&lt;/span&gt; 0;
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Код можно скачать здесь:&lt;br /&gt;
&lt;a href="http://source.centerix.ru/source/msv/Tuples/Tuples.cpp" class="m" target="_blank"&gt;http://source.centerix.ru/source/msv/Tuples/Tuples.cpp&lt;/a&gt;&lt;br /&gt;
&lt;a href="ftp://source:source@source.centerix.ru/source/msv/Tuples/Tuples.cpp" class="m" target="_blank"&gt;ftp://source:source@source.centerix.ru/source/msv/Tuples/Tuples.cpp&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Простенько и со вкусом. Без кучи шаблонов. Так как я видел это в D.&lt;br /&gt;
Создать Typle не проблема, сложнее оказалось сделать их использование достаточно простым.&lt;br /&gt;
В итоге получилось сделать даже проще, чем я мог предполагать. Хватило одного класса.&lt;br /&gt;
В принципе, переменные в списке можно разделять любым знаком TPL a , b + c &amp;mdash; d * e / f &amp;lt; g &amp;gt; h; но думаю лучше оставить одну запятую, хотя практика показывает, что этого мало.&lt;br /&gt;
Единственный минус, это переменные после вызова функции: T(), a, b... К сожалению перед функцией так и не получилось сделать. при использовании +-*/&amp;lt;&amp;gt; переменные выполняли эти операции раньше. При разделении запятыми переменные вообще исчезали. В общем, против направления выполнения не попрешь.&lt;br /&gt;
&lt;br /&gt;
Контроль за количеством переменных и типами оставляю на программиста, если он ошибется вызывается memcpy(0, 0, 1); мне показалось это достаточно прямолинейное сообщение об ошибке. Можно сделать что-нибудь попроще.&lt;br /&gt;
&lt;br /&gt;
Таким же способом можно передавать туплы в функции. Запятые не прошли, пришлось использовать знаки +.&lt;br /&gt;
&lt;br /&gt;
Хотелось бы узнать, есть ли еще реализации туплов. Про туплы на boost слышал. Мне не понравилось. Там каждый шаг нужно описывать.&lt;br /&gt;
Хотелось бы узнать, есть ли желающие использовать мою разработку. Я не знаю, буду ли использовать ее, или более привычное получение результатов через адреса int &amp;amp;i. Я обычно стремлюсь к оптимизации, int &amp;amp;i быстрее. Хотя тут действительно небольшие потери в скорости.&lt;br /&gt;
&lt;br /&gt;
Разработка еще не закончена. Есть еще пара идей по ускорению. Если будут пожелание по расширению функционала, можно рассмотреть.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/Q7NyzzEK0v8" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Sat, 02 Apr 2011 09:34:52 GMT</pubDate>
		
			<author>MikelSV &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>2</slash:comments>
		
	</item>

	<item>
		<title>Ошибка в aes.hpp и aes.cpp</title>
		<link>http://www.rsdn.ru/Forum/src/4213760.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4213760.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4213760.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4213760</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4213760.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4213760</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Есть такая тема &lt;a href="http://www.rsdn.ru/forum/src/2477192.1.aspx" title="[C++] Advanced Encryption Standard (Rijndael)" class=" tips m" rel="#m2477192" target="_blank"&gt;[C++] Advanced Encryption Standard (Rijndael)&lt;div class="tooltip" id="m2477192"&gt;Автор: gear nuke&lt;br /&gt;Дата: 07.05.07&lt;/div&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
В ней выложены &lt;a href="http://www.rsdn.ru/forum/src/2477194.1.aspx" title="aes.hpp &amp;amp;amp; aes.cpp" class=" tips m" rel="#m2477194" target="_blank"&gt;исходники&lt;div class="tooltip" id="m2477194"&gt;Автор: gear nuke&lt;br /&gt;Дата: 07.05.07&lt;/div&gt;&lt;/a&gt;. При первом задании ключа происходит построение &lt;b&gt;статических&lt;/b&gt; таблиц! Поэтому параллельно из нескольких потоков такую реализацию использоваться нельзя (речь идет об отдельном экземпляре, а не о параллельном доступе)!&lt;br /&gt;
&lt;br /&gt;
Если вы хотите использовать шифрование в нескольких потоках одновременно, необходимо функцию init_tables() вынести в public и сделать статиком, а проверку&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
if( ! s_box[0] ) init_tables();&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
убрать из cpp.&lt;br /&gt;
&lt;br /&gt;
Теперь вначале программы вызывайте aes::init_tables() и можете использовать реализации aes в нескольких потоках.&lt;br /&gt;
&lt;br /&gt;
PS. К сожалению тема закрыта для комментариев, пришлось отдельную делать.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/ePyUp3IeCjM" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Tue, 29 Mar 2011 09:14:46 GMT</pubDate>
		
			<author>AgentRX &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>WR mutex под винду 2003-</title>
		<link>http://www.rsdn.ru/Forum/src/4211761.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4211761.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4211761.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4211761</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4211761.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4211761</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Потестировав известные реализации RW мютексов пришел к мнению, что они мягко говоря не идеальны. И по тому как они работают в экстремальных условиях стало ясно, что распределение приоритетов там не всегда логично.&lt;br /&gt;
Наконец реализовав то, что по моему мнению является идеальным дизайном я провёл несколько тестов.&lt;br /&gt;
i7 Win7 release, итерации за 2 секунды работы всреднем.&lt;br /&gt;
Для начала циферки:&lt;br /&gt;
Впустую:&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;Читающих/Пишущих: потоков &amp;mdash; 1/1; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 17571850 [12849582..25373812]&lt;br /&gt;
Reader: 22811587 [20543874..25737670]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 473317 [449095..504612]&lt;br /&gt;
Reader: 583480 [540999..610374]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 964481 [930885..987693]&lt;br /&gt;
Reader: 951201 [915743..979739]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 10/10; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 10186292 [8993933..11335822]&lt;br /&gt;
Reader: 20073894 [19296720..20842069]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 243614 [237284..248490]&lt;br /&gt;
Reader: 2435974 [2372662..2484779]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 690732 [678387..704493]&lt;br /&gt;
Reader: 387787 [281092..668993]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 100/100; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 12488187 [11040251..14616537]&lt;br /&gt;
Reader: 19373003 [17787928..21342143]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 45493 [44475..46775]&lt;br /&gt;
Reader: 4549319 [4447461..4677469]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 673611 [658899..685033]&lt;br /&gt;
Reader: 488324 [355513..912665]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 1/100; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 40579876 [35215349..43018115]&lt;br /&gt;
Reader: 294583 [228763..357757]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 426384 [398431..449591]&lt;br /&gt;
Reader: 425354 [398366..448124]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 948498 [918588..999534]&lt;br /&gt;
Reader: 5865 [4611..7837]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 10/100; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 37609876 [32402064..40220011]&lt;br /&gt;
Reader: 3568099 [2817836..4689182]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 232870 [216410..244184]&lt;br /&gt;
Reader: 2328580 [2163973..2441728]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 918922 [902664..931336]&lt;br /&gt;
Reader: 59024 [49551..70554]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 100/10; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 94095 [32351..166210]&lt;br /&gt;
Reader: 25208319 [22283416..29773294]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 46237 [45409..46873]&lt;br /&gt;
Reader: 4623669 [4540849..4687261]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 360381 [276161..421879]&lt;br /&gt;
Reader: 2155818 [1422410..3113057]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 100/1; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 3171 [1131..10341]&lt;br /&gt;
Reader: 25676035 [22933782..30288583]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 5649 [5150..6161]&lt;br /&gt;
Reader: 19515644 [18671401..23383889]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 114752 [59787..151780]&lt;br /&gt;
Reader: 4626576 [4242130..5223980]&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
&lt;br /&gt;
С работой пишущих Sleep(10):&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;Читающих/Пишущих: потоков &amp;mdash; 1/1; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 200 [199..201]&lt;br /&gt;
Reader: 2886 [0..21443]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 200 [200..201]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 2236 [413..6963]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 10/10; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 195 [194..198]&lt;br /&gt;
Reader: 855739 [408601..1235543]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 2001 [2000..2010]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 5583 [3415..8839]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 100/100; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 197 [190..200]&lt;br /&gt;
Reader: 829675 [487839..1542292]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 20010 [20000..20100]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 4627 [3233..5839]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 1/100; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 200 [199..201]&lt;br /&gt;
Reader: 245202 [151070..385725]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 200 [200..201]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 114 [34..264]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 10/100; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 200 [200..200]&lt;br /&gt;
Reader: 297851 [242640..383785]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 200 [199..201]&lt;br /&gt;
Reader: 2000 [1990..2010]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 200 [200..201]&lt;br /&gt;
Reader: 742 [613..1066]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 100/10; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 146 [128..184]&lt;br /&gt;
Reader: 6282265 [2130911..8406613]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 200 [200..200]&lt;br /&gt;
Reader: 20000 [20000..20000]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 199 [199..200]&lt;br /&gt;
Reader: 51798 [41332..71292]&lt;br /&gt;
&lt;br /&gt;
Читающих/Пишущих: потоков &amp;mdash; 100/1; &lt;br /&gt;
SRWLOCK&lt;br /&gt;
Writer: 33 [7..110]&lt;br /&gt;
Reader: 20526658 [10612527..23590723]&lt;br /&gt;
Мой&lt;br /&gt;
Writer: 185 [126..200]&lt;br /&gt;
Reader: 1615123 [47649..8006288]&lt;br /&gt;
Другая Хорошая реализация&lt;br /&gt;
Writer: 188 [187..193]&lt;br /&gt;
Reader: 429406 [368932..502070]&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
&lt;br /&gt;
Ниже приведён код моего мютекса, для удобства разделённого на несколько частей.&lt;br /&gt;
Это компилируемый код, однако не организован в классы. С-style интерфейс.&lt;br /&gt;
&lt;br /&gt;
Defines&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; Exchange InterlockedCompareExchange64
&lt;span class='kw'&gt;#define&lt;/span&gt; Inc InterlockedIncrement64
&lt;span class='kw'&gt;#define&lt;/span&gt; Dec InterlockedDecrement64
&lt;span class='kw'&gt;#define&lt;/span&gt; Add InterlockedExchangeAdd64
&lt;span class='kw'&gt;typedef&lt;/span&gt; LONGLONG long_t;

&lt;span class='kw'&gt;typedef volatile&lt;/span&gt; long_t vlong_t;
&lt;span class='kw'&gt;#define&lt;/span&gt; LOOP(prev, counter) &lt;span class='kw'&gt;for&lt;/span&gt;(long_t prev = counter;;prev = counter)
&lt;span class='kw'&gt;#define&lt;/span&gt; bitsof(type) (&lt;span class='kw'&gt;sizeof&lt;/span&gt;(type) * 8)

&lt;span class='kw'&gt;const&lt;/span&gt; long_t flag_rlock = (long_t)1 &amp;lt;&amp;lt; (bitsof(long_t) - 1);
&lt;span class='kw'&gt;const&lt;/span&gt; long_t inc_r = (long_t)1 &amp;lt;&amp;lt; ((bitsof(long_t) - 1) / 4 * 3);
&lt;span class='kw'&gt;const&lt;/span&gt; long_t inc_w0 = (long_t)1 &amp;lt;&amp;lt; ((bitsof(long_t) - 1) / 4 * 2);
&lt;span class='kw'&gt;const&lt;/span&gt; long_t inc_w1 = (long_t)1 &amp;lt;&amp;lt; ((bitsof(long_t) - 1) / 4 * 1);
&lt;span class='kw'&gt;const&lt;/span&gt; long_t inc_w2 = (long_t)1 &amp;lt;&amp;lt; ((bitsof(long_t) - 1) / 4 * 0);

&lt;span class='kw'&gt;const&lt;/span&gt; long_t mask_w2 = inc_w1 - 1;
&lt;span class='kw'&gt;const&lt;/span&gt; long_t mask_w1 = (inc_w0 - 1)        &amp;amp; ~mask_w2;
&lt;span class='kw'&gt;const&lt;/span&gt; long_t mask_w0 = (inc_r - 1)        &amp;amp; ~(mask_w2 | mask_w1);
&lt;span class='kw'&gt;const&lt;/span&gt; long_t mask_r  = (flag_rlock - 1) &amp;amp; ~(mask_w2 | mask_w1 | mask_w0);
vlong_t Counter = 0;
HANDLE events[] = {CreateEvent(0,1,0,0),CreateEvent(0,1,0,0),CreateEvent(0,0,0,0)};
vlong_t waiting[] = {0,0,0}, reading = 0, writing = 0, rlockindex = 0;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
Exclusive Lock&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;void&lt;/span&gt; WLock()
{
    long_t prev = Inc(&amp;amp;Counter) - inc_w2;
    long_t mask = mask_w2 | mask_r | ((prev &amp;amp; flag_rlock)?mask_w0:mask_w1);
    &lt;span class='kw'&gt;if&lt;/span&gt; (prev &amp;amp; mask)
    {
        WaitEvent(events[2]);    
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
Shared Lock&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;void&lt;/span&gt; RLock()
{
    LOOP(prev, Counter)
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; (prev &amp;amp; mask_w2)
        {
            &lt;span class='kw'&gt;if&lt;/span&gt; (prev &amp;amp; flag_rlock)
            {
                &lt;span class='kw'&gt;if&lt;/span&gt; (Exchange(&amp;amp;Counter, prev + inc_w1, prev) == prev)
                {
                    WaitEvent(events[1]);
                    &lt;span class='kw'&gt;if&lt;/span&gt; ((Add(&amp;amp;Counter, inc_r - inc_w1) &amp;amp; mask_w1) == inc_w1)
                    {
                        ResetEvent(events[1]);
                    }
                    &lt;span class='kw'&gt;break&lt;/span&gt;;
                }
            }
            &lt;span class='kw'&gt;else&lt;/span&gt;
            {
                &lt;span class='kw'&gt;if&lt;/span&gt; (Exchange(&amp;amp;Counter, prev + inc_w0, prev) == prev)
                {
                    WaitEvent(events[0]);
                    &lt;span class='kw'&gt;if&lt;/span&gt; ((Add(&amp;amp;Counter, inc_r - inc_w0) &amp;amp; mask_w0) == inc_w0)
                    {
                        ResetEvent(events[0]);
                    }
                    &lt;span class='kw'&gt;break&lt;/span&gt;;
                }
            }
        }
        &lt;span class='kw'&gt;else&lt;/span&gt;
        {
            &lt;span class='kw'&gt;if&lt;/span&gt; (Exchange(&amp;amp;Counter, prev + inc_r, prev) == prev)
            {
                &lt;span class='kw'&gt;break&lt;/span&gt;;
            }
        }
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
Exclusive Release&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;void&lt;/span&gt; WRelease()
{
    LOOP(prev, Counter)
    {
        long_t flag = prev &amp;amp; flag_rlock;
        &lt;span class='kw'&gt;if&lt;/span&gt; (prev &amp;amp; (flag?mask_w1:mask_w0))
        {
            &lt;span class='kw'&gt;if&lt;/span&gt; (Exchange(&amp;amp;Counter, (prev ^ flag_rlock) - inc_w2, prev) == prev)
            {
                SetEvent(events[flag?1:0]);
                &lt;span class='kw'&gt;break&lt;/span&gt;;
            }
        }
        &lt;span class='kw'&gt;else if&lt;/span&gt; (Exchange(&amp;amp;Counter, prev - inc_w2, prev) == prev)
        {            
            &lt;span class='kw'&gt;if&lt;/span&gt; (prev &amp;amp; mask_w2)
            {
                SetEvent(events[2]);
            }
            &lt;span class='kw'&gt;break&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
Shared Release&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;void&lt;/span&gt; RRelease()
{
    long_t prev = Add(&amp;amp;Counter, - inc_r);
    &lt;span class='kw'&gt;if&lt;/span&gt; (prev &amp;amp; mask_w2)
    {
        long_t flag = prev &amp;amp; flag_rlock;
        &lt;span class='kw'&gt;if&lt;/span&gt; ((prev &amp;amp; (mask_r | (flag?mask_w0:mask_w1))) == inc_r)
        {
            SetEvent(events[2]);
        }
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
&lt;br /&gt;
Другая хорошая реализация. Выбрал именно эту, так как она рабочая и не приводит к голоданию в крайних случаях.&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
CRITICAL_SECTION CritCheck;
BOOL init3 = InitializeCriticalSectionAndSpinCount(&amp;amp;CritCheck, 0xFF);
HANDLE EventLock = CreateEvent(NULL, FALSE, TRUE, NULL);
&lt;span class='kw'&gt;volatile long&lt;/span&gt; NumReaders = 0;

&lt;span class='kw'&gt;void&lt;/span&gt; WLock()
{
    EnterCriticalSection(&amp;amp;CritCheck);
    WaitForSingleObject(EventLock, INFINITE);        
    LeaveCriticalSection(&amp;amp;CritCheck);
}
&lt;span class='kw'&gt;void&lt;/span&gt; RLock()
{
    EnterCriticalSection(&amp;amp;CritCheck);
    &lt;span class='kw'&gt;if&lt;/span&gt; (InterlockedIncrement(&amp;amp;NumReaders) == 1) {
        WaitForSingleObject(CritCheck, INFINITE);
    }
    LeaveCriticalSection(&amp;amp;CritCheck);
}
&lt;span class='kw'&gt;void&lt;/span&gt; WRelease()
{
    SetEvent(m_hEventLock);
}

&lt;span class='kw'&gt;void&lt;/span&gt; RRelease()
{
    &lt;span class='kw'&gt;if&lt;/span&gt; (InterlockedDecrement(&amp;amp;NumReaders) == 0) {
        SetEvent(EventLock);
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;br /&gt;
&lt;br /&gt;
Выводы после Вас &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/smile.gif' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/nu0O_FU22Lg" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Sun, 27 Mar 2011 13:51:14 GMT</pubDate>
		
			<author>Caracrist &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>10</slash:comments>
		
	</item>

	<item>
		<title>make clean for Visual Studio</title>
		<link>http://www.rsdn.ru/Forum/src/4160982.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4160982.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4160982.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4160982</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4160982.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4160982</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Иногда возникает необходимость скопировать папку проекта (Visual Studio), например, на флешку или в сетевую шару. Проблемой становятся файлы, которые нагенерировала студия: база Intellisense, логи, объектные файлы и т.п. Из простого копирования нескольких *.cpp файлов процесс может превратиться в довольно длительное ожидание или нехватку места &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/smile.gif' /&gt; Написал небольшую утилитку которая удаляет "лишние" файлы студии в указанной папке и подпапках. Пример использования:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
.\vsgarbage D:\Projects\CPP\HelloWorld&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
Код утилиты:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;iostream&amp;gt;

&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;boost/filesystem.hpp&amp;gt;

&lt;span class='kw'&gt;namespace&lt;/span&gt; fs = boost::filesystem;

&lt;span class='kw'&gt;typedef&lt;/span&gt; std::vector&amp;lt;std::string&amp;gt; GarbageList;

GarbageList g_garbage_extensions;
&lt;span class='kw'&gt;const int&lt;/span&gt; EQUALS = 0;  &lt;span class='com'&gt;// Strings are equals&lt;/span&gt;

&lt;span class='kw'&gt;void&lt;/span&gt; InitializeGarbageFileExtensions(GarbageList&amp;amp; list)
{
    list.push_back(&lt;span class='str'&gt;".obj"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".log"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".sdf"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".ipch"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".idb"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".pdb"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".ilk"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".dep"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".tmp"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".tlog"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".lastbuildstate"&lt;/span&gt;);
    list.push_back(&lt;span class='str'&gt;".opensdf"&lt;/span&gt;);
}

&lt;span class='kw'&gt;bool&lt;/span&gt; IsGarbage(fs::path&amp;amp; item)
{
    &lt;span class='kw'&gt;if&lt;/span&gt; (!fs::is_directory(item))  &lt;span class='com'&gt;// Only files are checked&lt;/span&gt;
    {
        std::string extension = item.extension();
        &lt;span class='kw'&gt;for&lt;/span&gt; (GarbageList::iterator it = g_garbage_extensions.begin();
            it != g_garbage_extensions.end(); ++it)
        {
            std::string&amp;amp; current = (*it);
            &lt;span class='kw'&gt;if&lt;/span&gt; (extension.compare(current) == EQUALS)
            {
                &lt;span class='kw'&gt;return true&lt;/span&gt;;
            }
        }
    }
    &lt;span class='kw'&gt;return false&lt;/span&gt;;
}

&lt;span class='kw'&gt;int&lt;/span&gt; main(&lt;span class='kw'&gt;int&lt;/span&gt; argc, &lt;span class='kw'&gt;char&lt;/span&gt;** argv)
{    
    &lt;span class='kw'&gt;if&lt;/span&gt; (argc &amp;gt; 1)
    {
        &lt;span class='kw'&gt;char&lt;/span&gt;* dir = argv[1];
        std::cout &amp;lt;&amp;lt; &lt;span class='str'&gt;"Deleting garbage in: "&lt;/span&gt; &amp;lt;&amp;lt; dir &amp;lt;&amp;lt; std::endl;
        fs::path dir_path(dir);
        &lt;span class='kw'&gt;if&lt;/span&gt; (fs::is_directory(dir_path))
        {
            InitializeGarbageFileExtensions(g_garbage_extensions);
            fs::recursive_directory_iterator end_it;
            &lt;span class='kw'&gt;int&lt;/span&gt; items_removed = 0;
            &lt;span class='kw'&gt;for&lt;/span&gt; (fs::recursive_directory_iterator it(dir_path); it != end_it; ++it)
            {
                fs::path current(it-&amp;gt;path());
                &lt;span class='kw'&gt;if&lt;/span&gt; (IsGarbage(current))
                {
                    fs::remove(current);
                    items_removed++;
                }
            }
            std::cout &amp;lt;&amp;lt; &lt;span class='str'&gt;"Items deleted: "&lt;/span&gt; &amp;lt;&amp;lt; items_removed &amp;lt;&amp;lt; std::endl;
        }
        &lt;span class='kw'&gt;else&lt;/span&gt;
        {
            std::cerr &amp;lt;&amp;lt; &lt;span class='str'&gt;"Error. Specified path is not a directory\n"&lt;/span&gt;;
        }
    }
    &lt;span class='kw'&gt;else&lt;/span&gt;
    {
        std::cout &amp;lt;&amp;lt; &lt;span class='str'&gt;"Usage: .\\vsgarbage path_to_directory\n"&lt;/span&gt;;
    }
    &lt;span class='kw'&gt;return&lt;/span&gt; 0;
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
Готовный бинарник можно взять в прикрепленных файлах.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/NGyVZQ2x9h0" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Wed, 16 Feb 2011 18:07:49 GMT</pubDate>
		
			<author>InstantI &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>Делегаты для C++</title>
		<link>http://www.rsdn.ru/Forum/src/4143207.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4143207.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4143207.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4143207</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4143207.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4143207</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Здравствуйте&lt;br /&gt;
&lt;br /&gt;
Выкладываю реализации делегатов TSingleDelegate и TMultiDelegate, которые использую сам. Возможно кому-то пригодится, кто любит простоту, удобство и эффективность. Код базируется на делегатах от Don Clugston, по этому, кто уже их использовал, осваивать не придется &lt;b&gt;(только для VC++)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://files.rsdn.ru/89703/delegate.zip" class="m" target="_blank"&gt;Ссылка на архив&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Пример/туториал:&lt;/b&gt;&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;vector&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;delegate.hpp&amp;gt;

&lt;span class='com'&gt;///////////////////////////////////////////////////////////////////////////////&lt;/span&gt;

&lt;span class='kw'&gt;void&lt;/span&gt; sf3(&lt;span class='kw'&gt;int&lt;/span&gt;, &lt;span class='kw'&gt;int&lt;/span&gt;, &lt;span class='kw'&gt;int&lt;/span&gt;) { std::cout &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; &lt;span class='str'&gt;"()"&lt;/span&gt; &amp;lt;&amp;lt; std::endl; }

&lt;span class='kw'&gt;class&lt;/span&gt; A
{
&lt;span class='kw'&gt;public&lt;/span&gt;:
    &lt;span class='kw'&gt;void&lt;/span&gt; mf3(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;) { std::cout &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; &lt;span class='str'&gt;"()"&lt;/span&gt; &amp;lt;&amp;lt; std::endl; }
    &lt;span class='kw'&gt;void&lt;/span&gt; cf3(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;) &lt;span class='kw'&gt;const&lt;/span&gt; { std::cout &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; &lt;span class='str'&gt;"() const"&lt;/span&gt; &amp;lt;&amp;lt; std::endl; }
    &lt;span class='kw'&gt;static void&lt;/span&gt; sf3(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;) { std::cout &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; &lt;span class='str'&gt;"()"&lt;/span&gt; &amp;lt;&amp;lt; std::endl; }
    &lt;span class='kw'&gt;virtual void&lt;/span&gt; vf3(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;) { std::cout &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; &lt;span class='str'&gt;"() virtual"&lt;/span&gt; &amp;lt;&amp;lt; std::endl; }
    &lt;span class='kw'&gt;virtual void&lt;/span&gt; vcf3(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;) &lt;span class='kw'&gt;const&lt;/span&gt; { std::cout &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; &lt;span class='str'&gt;"() virtual const"&lt;/span&gt; &amp;lt;&amp;lt; std::endl; }
};

&lt;span class='kw'&gt;class&lt;/span&gt; B : &lt;span class='kw'&gt;public&lt;/span&gt; A
{
&lt;span class='kw'&gt;private&lt;/span&gt;:
    WCHAR _buf[256];

&lt;span class='kw'&gt;public&lt;/span&gt;:
    &lt;span class='kw'&gt;virtual void&lt;/span&gt; vf3(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;) { std::cout &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; &lt;span class='str'&gt;"() override"&lt;/span&gt; &amp;lt;&amp;lt; std::endl; }
    &lt;span class='kw'&gt;virtual void&lt;/span&gt; vcf3(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;) &lt;span class='kw'&gt;const&lt;/span&gt; { std::cout &amp;lt;&amp;lt; __FUNCTION__ &amp;lt;&amp;lt; &lt;span class='str'&gt;"() override const"&lt;/span&gt; &amp;lt;&amp;lt; std::endl; }
};

&lt;span class='com'&gt;///////////////////////////////////////////////////////////////////////////////&lt;/span&gt;

&lt;span class='kw'&gt;void&lt;/span&gt; wmain(&lt;span class='kw'&gt;int&lt;/span&gt; argc, &lt;span class='kw'&gt;wchar_t&lt;/span&gt;** args)
{
    &lt;span class='kw'&gt;typedef&lt;/span&gt; TSingleDelegate&amp;lt;&lt;span class='kw'&gt;void&lt;/span&gt;(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;)&amp;gt; TSD3;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; TMultiDelegate&amp;lt;&lt;span class='kw'&gt;void&lt;/span&gt;(&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;,&lt;span class='kw'&gt;int&lt;/span&gt;)&amp;gt; TMD3;
    std::vector&amp;lt;TSD3&amp;gt; sdl;
    std::vector&amp;lt;TMD3&amp;gt; mdl;

    A a;
    B b;
    &lt;span class='kw'&gt;const&lt;/span&gt; A* ac = &lt;span class='kw'&gt;new&lt;/span&gt; A();
    &lt;span class='kw'&gt;const&lt;/span&gt; B* bc = &lt;span class='kw'&gt;new&lt;/span&gt; B();

    &lt;span class='com'&gt;/* TSingleDelegate - содержит единственную связь */

    /* конструкторы */&lt;/span&gt;
    TSD3 sd01;                            &lt;span class='com'&gt;//пустой делегат, при вызове проверяется на NULL,- безопасно&lt;/span&gt;
    TSD3 sd02(sf3);                    &lt;span class='com'&gt;//статическая функция&lt;/span&gt;
    TSD3 sd03 = sf3;                &lt;span class='com'&gt;//статическая функция (вид сбоку)&lt;/span&gt;
    TSD3 sd04(&amp;amp;A::sf3);            &lt;span class='com'&gt;//статическая функция класса&lt;/span&gt;
    TSD3 sd05 = &amp;amp;A::sf3;        &lt;span class='com'&gt;//статическая функция класса (вид сбоку)&lt;/span&gt;
    TSD3 sd06 = &amp;amp;B::sf3;        &lt;span class='com'&gt;//всё та же встатическая функция&lt;/span&gt;
    TSD3 sd07(&amp;amp;a, &amp;amp;A::mf3);    &lt;span class='com'&gt;//фукнция класса&lt;/span&gt;
    TSD3 sd08(&amp;amp;a, &amp;amp;A::cf3); &lt;span class='com'&gt;//константная функция класса&lt;/span&gt;
    TSD3 sd09(ac, &amp;amp;A::vf3); &lt;span class='com'&gt;//виртуальная функция константного класса&lt;/span&gt;
    TSD3 sd10(&amp;amp;b, &amp;amp;B::mf3); &lt;span class='com'&gt;//функция другого класса&lt;/span&gt;
    TSD3 sd11(bc, &amp;amp;B::cf3); &lt;span class='com'&gt;//константная функция другого константного класса&lt;/span&gt;
    TSD3 sd12(bc, &amp;amp;B::vcf3);&lt;span class='com'&gt;//перегруженная виртуальная константная функция другого константного класса&lt;/span&gt;
    TSD3 sd13(sd10);                &lt;span class='com'&gt;//копирование из другого делегата&lt;/span&gt;
    TSD3 sd14 = sd12;                &lt;span class='com'&gt;//копирование из другого делегата (вид сбоку)&lt;/span&gt;
    TSD3 sd15(sd11.GetMemFunc());    &lt;span class='com'&gt;//копирование из анонимного указателя (TMemFunc)&lt;/span&gt;
    sd15.Clear(), sd15.Unbind();    &lt;span class='com'&gt;//удаление связи

    /* связывание */&lt;/span&gt;
    TSD3 sd21;
    TSD3 sd22(sf3);
    TSD3 sd23; sd23.Bind(sf3);
    TSD3 sd24; sd24.Bind(&amp;amp;A::sf3);
    TSD3 sd25; sd25.Bind(&amp;amp;B::sf3);
    TSD3 sd26; sd26.Bind(&amp;amp;a, &amp;amp;A::mf3);
    TSD3 sd27; sd27.Bind(&amp;amp;a, &amp;amp;A::cf3);
    TSD3 sd28; sd28.Bind(ac, &amp;amp;A::vf3);
    TSD3 sd29; sd29.Bind(&amp;amp;b, &amp;amp;B::mf3);
    TSD3 sd30; sd30.Bind(bc, &amp;amp;B::cf3);
    TSD3 sd31; sd31.Bind(ac, &amp;amp;A::vcf3);
    TSD3 sd32; sd32.Bind(bc, &amp;amp;B::vcf3);
    TSD3 sd33; sd33.Bind(sd31.GetMemFunc());
    TSD3 sd34 = sd32;
    TSD3 sd35; sd35.SetMemFunc(sd33.GetMemFunc());

    sdl.push_back(sd01), sdl.push_back(sd02), sdl.push_back(sd03), sdl.push_back(sd04), sdl.push_back(sd05);
    sdl.push_back(sd06), sdl.push_back(sd07), sdl.push_back(sd08), sdl.push_back(sd09), sdl.push_back(sd10);
    sdl.push_back(sd11), sdl.push_back(sd12), sdl.push_back(sd13), sdl.push_back(sd14), sdl.push_back(sd15);
    sdl.push_back(sd21), sdl.push_back(sd22), sdl.push_back(sd23), sdl.push_back(sd24), sdl.push_back(sd25);
    sdl.push_back(sd26), sdl.push_back(sd27), sdl.push_back(sd28), sdl.push_back(sd29), sdl.push_back(sd30);
    sdl.push_back(sd31), sdl.push_back(sd32), sdl.push_back(sd33), sdl.push_back(sd34), sdl.push_back(sd35);

    &lt;span class='com'&gt;/* вызов функций */&lt;/span&gt;
    &lt;span class='kw'&gt;for&lt;/span&gt; (size_t n = 0; n &amp;lt; sdl.size(); n++) sdl[n](1,2,3);
    std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;

    &lt;span class='com'&gt;/* TMultiDelegate - содержит неограниченное кол-во связей */
    /* конструкция (аналогично TSingleDelegate) */&lt;/span&gt;
    TMD3 md01;
    TMD3 md02(sf3);
    TMD3 md03 = sf3;
    TMD3 md04(&amp;amp;A::sf3);
    TMD3 md05 = &amp;amp;A::sf3;
    TMD3 md06 = &amp;amp;B::sf3;
    TMD3 md07(&amp;amp;a, &amp;amp;A::mf3);
    TMD3 md08(&amp;amp;a, &amp;amp;A::cf3);
    TMD3 md09(ac, &amp;amp;A::vf3);
    TMD3 md10(&amp;amp;b, &amp;amp;B::mf3);
    TMD3 md11(bc, &amp;amp;B::cf3);
    TMD3 md12(bc, &amp;amp;B::vf3);
    TMD3 md13(md10);
    TMD3 md14(sd11.GetMemFunc());
    TMD3 md15 = md12;

    &lt;span class='com'&gt;/* связывание (аналогично TSingleDelegate, только каждый метод можно связывать сколько угодно раз) */&lt;/span&gt;
    TMD3 md21;
    TMD3 md22(sf3);
    TMD3 md23; md23.Bind(sf3);
    TMD3 md24; md24.Bind(&amp;amp;A::sf3);
    TMD3 md25; md25.Bind(&amp;amp;B::sf3);
    TMD3 md26; md26.Bind(&amp;amp;a, &amp;amp;A::mf3);
    TMD3 md27; md27.Bind(&amp;amp;a, &amp;amp;A::cf3);
    TMD3 md28; md28.Bind(ac, &amp;amp;A::vf3); md28.Bind(ac, &amp;amp;A::vf3);
    TMD3 md29; md29.Bind(&amp;amp;b, &amp;amp;B::mf3);
    TMD3 md30; md30.Bind(bc, &amp;amp;B::cf3); md30.Bind(bc, &amp;amp;B::cf3);
    TMD3 md31; md31.Bind(ac, &amp;amp;A::vcf3);
    TMD3 md32; md32.Bind(bc, &amp;amp;B::vcf3);
    TMD3 md33; md33.Bind(sd31.GetMemFunc());
    TMD3 md34 = md32;
    TMD3 md35;

    mdl.push_back(md01), mdl.push_back(md02), mdl.push_back(md03), mdl.push_back(md04), mdl.push_back(md05);
    mdl.push_back(md06), mdl.push_back(md07), mdl.push_back(md08), mdl.push_back(md09), mdl.push_back(md10);
    mdl.push_back(md11), mdl.push_back(md12), mdl.push_back(md13), mdl.push_back(md14), mdl.push_back(md15);
    mdl.push_back(md21), mdl.push_back(md22), mdl.push_back(md23), mdl.push_back(md24), mdl.push_back(md25);
    mdl.push_back(md26), mdl.push_back(md27), mdl.push_back(md28), mdl.push_back(md29), mdl.push_back(md30);
    mdl.push_back(md31), mdl.push_back(md32), mdl.push_back(md33), mdl.push_back(md34), mdl.push_back(md35);

    &lt;span class='com'&gt;/* выполнение */&lt;/span&gt;
    &lt;span class='kw'&gt;for&lt;/span&gt; (size_t n = 0; n &amp;lt; mdl.size(); n++) mdl[n](1,2,3);
    std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;

    &lt;span class='com'&gt;/////////////////////////////////////////////////////////////////////////////&lt;/span&gt;

    TMD3 md40(md24), md41, md42;
    md40.Bind(&amp;amp;B::sf3);                    &lt;span class='com'&gt;//связывание статической функции (можно и через оператор)&lt;/span&gt;
    md40 += md26, md40 += md27, md40 += md28, md40 += md31, md40 += md32;    &lt;span class='com'&gt;//связывание через оператор +=&lt;/span&gt;
    md40 -= md25;                                &lt;span class='com'&gt;//удаление через оператор -=&lt;/span&gt;
    md41.Bind(md40);                        &lt;span class='com'&gt;//добавление всех связей из другого делегата&lt;/span&gt;
    md42 = md41;                                &lt;span class='com'&gt;//удаление текущих, добавление всех связей из другого делегата&lt;/span&gt;
    md40 -= sf3;                                    &lt;span class='com'&gt;//удаление статической функции через оператор -=&lt;/span&gt;
    md40.Unbind(ac, &amp;amp;A::vcf3);    &lt;span class='com'&gt;//удаление метода&lt;/span&gt;
    md40 += sd23.GetMemFunc();    &lt;span class='com'&gt;//связывание метода из TSingleDelegate через анонимный указатель (TMemFunc)&lt;/span&gt;
    md40 -= sd26.GetMemFunc();        &lt;span class='com'&gt;//удаление метода из TSingleDelegate через анонимный указатель (TMemFunc)&lt;/span&gt;
    md42.Length();                            &lt;span class='com'&gt;//кол-во всех связей&lt;/span&gt;
    md42.Clear();                                &lt;span class='com'&gt;//удаление всех связей
    //Bind(); Unbind(); операторы +=, -= возвращают общее кол-во связей&lt;/span&gt;

    md40(1,2,3);    &lt;span class='com'&gt;//вызов всех-всех связей в порядке добавления&lt;/span&gt;
    std::cout &amp;lt;&amp;lt; std::endl;

    &lt;span class='kw'&gt;if&lt;/span&gt; (!md41.IsEmpty()) md41.Invoke(1,2,3);    &lt;span class='com'&gt;//проверка на наличие связей, вызов всех связей&lt;/span&gt;
    std::cout &amp;lt;&amp;lt; std::endl;

    md41 -= md40;                                    &lt;span class='com'&gt;//удаление всех связей md40 из md41&lt;/span&gt;
    &lt;span class='kw'&gt;if&lt;/span&gt; (md41) md41.Invoke(1,2,3);    &lt;span class='com'&gt;//проверка на наличие связей, вызов что осталось&lt;/span&gt;
    std::cout &amp;lt;&amp;lt; std::endl;

    &lt;span class='com'&gt;/* сравнение */&lt;/span&gt;
    &lt;span class='kw'&gt;if&lt;/span&gt; (sd11 &amp;lt; sd12) std::cout &amp;lt;&amp;lt; &lt;span class='str'&gt;"sd11 &amp;lt; sd12"&lt;/span&gt; &amp;lt;&amp;lt; std::endl;
    std::cout &amp;lt;&amp;lt; &lt;span class='str'&gt;"sd05"&lt;/span&gt; &amp;lt;&amp;lt; (sd05 == sd06 ? &lt;span class='str'&gt;" == "&lt;/span&gt; : &lt;span class='str'&gt;" != "&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span class='str'&gt;"sd06"&lt;/span&gt; &amp;lt;&amp;lt; std::endl;
    std::cout &amp;lt;&amp;lt; &lt;span class='str'&gt;"md41"&lt;/span&gt; &amp;lt;&amp;lt; (md41 == md40 ? &lt;span class='str'&gt;" == "&lt;/span&gt; : &lt;span class='str'&gt;" != "&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span class='str'&gt;"md40"&lt;/span&gt; &amp;lt;&amp;lt; std::endl;
    std::cout &amp;lt;&amp;lt; std::endl;
    
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/5BttI1kQr-U" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Fri, 04 Feb 2011 19:28:49 GMT</pubDate>
		
			<author>о_О &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>binary heap с возможностью изменения [C++]</title>
		<link>http://www.rsdn.ru/Forum/src/4134696.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4134696.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4134696.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4134696</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4134696.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4134696</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Есть такие стандартные функции &amp;mdash; std::make_heap, std::push_heap, std::pop_heap. Всё с ними здорово, но иногда возникает необходимость поменять какой-нибудь элемент в куче, не являющийся верхним. Само по себе это не сложно, но в станартной библиотеке такой функции нет. Тк что завелся такой велосипед.&lt;br /&gt;
&lt;br /&gt;
Пользоваться так же, как и стандартными, только если требуется изменить элемент в куче, то после изменения вызываем update_heap.&lt;br /&gt;
&lt;br /&gt;
Используется C++0x, чтобы превратить в старый добрый обычный C++ достаточно убрать все std::move.&lt;br /&gt;
&lt;br /&gt;
Почему потребовалось писать свои версии make_heap, push_heap, pop_heap? Порядок элементов в куче стандартом никак не гарантируется, за исключением того, что первый элемент &amp;mdash; самый большой, поэтому чтобы быть полностью уверенным пришлось сделать своё.&lt;br /&gt;
&lt;br /&gt;
Удалить произвольный элемент из кучи тоже можно:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
some_iterator heap_begin, heap_end;
some_iterator to_delate_from_heap;
*to_delete_from_heap = *( heap_end - 1 );
--heap_end;
update_heap( heap_begin, heap_end, to_delete_from_heap );&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Собственно код:&lt;br /&gt;
&lt;table style="margin-top:5px;margin-bottom:5px" cellpadding="0" cellspacing="0"&gt; 	&lt;tbody onclick="toggleExpand(this)" style="cursor:pointer"&gt; 		&lt;tr&gt; 			&lt;td style="width:10px" class="hidden_Plus"&gt;				&amp;nbsp;			&lt;/td&gt;			&lt;td style="font-weight:bold;padding-left:2px;font-family:Verdana,Arial;font-size:9pt;"&gt;								Скрытый текст			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(http://www.rsdn.ru/Forum/images/line.gif);background-repeat:repeat-y;background-position:center"&gt;							&lt;/td&gt;			&lt;td style="padding-left:3px;font-family:Verdana,Arial;font-size:8pt"&gt;&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='com'&gt;/// \file heapext.h&lt;/span&gt;

&lt;span class='kw'&gt;#ifndef&lt;/span&gt; heapext_h
&lt;span class='kw'&gt;#define&lt;/span&gt; heapext_h

&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;cassert&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;utility&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;iterator&amp;gt;

&lt;span class='kw'&gt;namespace&lt;/span&gt; heapext
{
    &lt;span class='kw'&gt;namespace&lt;/span&gt; detail
    {
        &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_diff, &lt;span class='kw'&gt;typename&lt;/span&gt; t_value&amp;gt;
        &lt;span class='kw'&gt;inline void&lt;/span&gt; down_heap( t_iter begin, t_diff size, t_diff idx, t_value val )
        {
            &lt;span class='kw'&gt;while&lt;/span&gt;( idx &amp;lt; size )
            {
                t_diff &lt;span class='kw'&gt;const&lt;/span&gt; left = 2*idx + 1;
                t_diff &lt;span class='kw'&gt;const&lt;/span&gt; right = 2*idx + 2;

                t_diff largest;
                &lt;span class='kw'&gt;if&lt;/span&gt;( right &amp;lt; size )
                    largest = *( begin + right ) &amp;lt; *( begin + left ) ? left : right;
                &lt;span class='kw'&gt;else if&lt;/span&gt;( left &amp;lt; size )
                    largest = left;
                &lt;span class='kw'&gt;else
                    break&lt;/span&gt;;

                &lt;span class='kw'&gt;if&lt;/span&gt;( val &amp;lt; *( begin + largest ) )
                {
                    *( begin + idx ) = std::move( *( begin + largest ) );
                    idx = largest;
                }
                &lt;span class='kw'&gt;else
                    break&lt;/span&gt;;
            }

            *( begin + idx ) = std::move( val );
        }

        &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_diff, &lt;span class='kw'&gt;typename&lt;/span&gt; t_value&amp;gt;
        &lt;span class='kw'&gt;inline void&lt;/span&gt; up_heap( t_iter begin, t_diff idx, t_value val )
        {
            t_diff parent = ( idx - 1 )/2;
            &lt;span class='kw'&gt;while&lt;/span&gt;( idx &amp;amp;&amp;amp; *( begin + parent ) &amp;lt; val )
            {
                *( begin + idx ) = std::move( *( begin + parent ) );
                idx = parent;
                parent = ( idx - 1 )/2;
            }
            *( begin + idx ) = std::move( val );
        }

        &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_diff, &lt;span class='kw'&gt;typename&lt;/span&gt; t_value, &lt;span class='kw'&gt;typename&lt;/span&gt; t_cmp&amp;gt;
        &lt;span class='kw'&gt;inline void&lt;/span&gt; down_heap( t_iter begin, t_diff size, t_diff idx, t_value val, t_cmp cmp )
        {
            &lt;span class='kw'&gt;while&lt;/span&gt;( idx &amp;lt; size )
            {
                t_diff &lt;span class='kw'&gt;const&lt;/span&gt; left = 2*idx + 1;
                t_diff &lt;span class='kw'&gt;const&lt;/span&gt; right = 2*idx + 2;

                t_diff largest;
                &lt;span class='kw'&gt;if&lt;/span&gt;( right &amp;lt; size )
                    largest = cmp( *( begin + right ), *( begin + left ) ) ? left : right;
                &lt;span class='kw'&gt;else if&lt;/span&gt;( left &amp;lt; size )
                    largest = left;
                &lt;span class='kw'&gt;else
                    break&lt;/span&gt;;

                &lt;span class='kw'&gt;if&lt;/span&gt;( cmp( val, *( begin + largest ) ) )
                {
                    *( begin + idx ) = std::move( *( begin + largest ) );
                    idx = largest;
                }
                &lt;span class='kw'&gt;else
                    break&lt;/span&gt;;
            }

            *( begin + idx ) = std::move( val );
        }

        &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_diff, &lt;span class='kw'&gt;typename&lt;/span&gt; t_value, &lt;span class='kw'&gt;typename&lt;/span&gt; t_cmp&amp;gt;
        &lt;span class='kw'&gt;inline void&lt;/span&gt; up_heap( t_iter begin, t_diff idx, t_value val, t_cmp cmp )
        {
            t_diff parent = ( idx - 1 )/2;
            &lt;span class='kw'&gt;while&lt;/span&gt;( idx &amp;amp;&amp;amp; cmp( *( begin + parent ), val ) )
            {
                *( begin + idx ) = std::move( *( begin + parent ) );
                idx = parent;
                parent = ( idx - 1 )/2;
            }
            *( begin + idx ) = std::move( val );
        }
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; push_heap( t_iter begin, t_iter end )
    {
        assert( end - begin &amp;gt;= 1 );
        detail::up_heap( begin, end - begin - 1, std::move( *( end - 1 ) ) );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; pop_heap( t_iter begin, t_iter end )
    {
        assert( end - begin &amp;gt;= 1 );
        &lt;span class='kw'&gt;typename&lt;/span&gt; std::iterator_traits&amp;lt;t_iter&amp;gt;::value_type val = std::move( *( end - 1 ) );
        *( end - 1 ) = std::move( *begin );
        detail::down_heap( begin, end - begin - 1, 0, std::move( val ) );
    }

    &lt;span class='com'&gt;/// Same as pop_heap, but didn't move *begin to *(end-1)&lt;/span&gt;
    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; pop_heap_drop( t_iter begin, t_iter end )
    {
        assert( end - begin &amp;gt;= 1 );
        detail::down_heap( begin, end - begin - 1, 0, std::move( *( end - 1 ) ) );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; update_heap( t_iter begin, t_iter end, t_iter changed )
    {
        assert( end - begin &amp;gt;= 1 );
        assert( begin &amp;lt;= changed &amp;amp;&amp;amp; changed &amp;lt; end );

        &lt;span class='kw'&gt;typedef typename&lt;/span&gt; std::iterator_traits&amp;lt;t_iter&amp;gt;::value_type t_value;
        &lt;span class='kw'&gt;typedef typename&lt;/span&gt; std::iterator_traits&amp;lt;t_iter&amp;gt;::difference_type t_diff;

        t_diff &lt;span class='kw'&gt;const&lt;/span&gt; idx = changed - begin;
        t_diff &lt;span class='kw'&gt;const&lt;/span&gt; parent = ( idx - 1 )/2;
        &lt;span class='kw'&gt;if&lt;/span&gt;( idx &amp;gt; 0 &amp;amp;&amp;amp; *( begin + parent ) &amp;lt; *changed )
            detail::up_heap( begin, idx, std::move( *changed ) );
        &lt;span class='kw'&gt;else&lt;/span&gt;
            detail::down_heap( begin, end - begin, idx, std::move( *changed ) );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; make_heap( t_iter begin, t_iter end )
    {
        &lt;span class='kw'&gt;typedef typename&lt;/span&gt; std::iterator_traits&amp;lt;t_iter&amp;gt;::difference_type t_diff;
        t_diff &lt;span class='kw'&gt;const&lt;/span&gt; size = end - begin;
        &lt;span class='kw'&gt;for&lt;/span&gt;( t_diff idx = size/2 - 1; idx &amp;gt;= 0; --idx )
            detail::down_heap( begin, size, idx, std::move( *( begin + idx ) ) );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; sort_heap( t_iter begin, t_iter end )
    {
        &lt;span class='kw'&gt;while&lt;/span&gt;( end - begin &amp;gt; 1 )
            heapext::pop_heap( begin, end-- );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_cmp&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; push_heap( t_iter begin, t_iter end, t_cmp cmp )
    {
        assert( end - begin &amp;gt;= 1 );
        detail::up_heap( begin, end - begin - 1, std::move( *( end - 1 ) ), cmp );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_cmp&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; pop_heap( t_iter begin, t_iter end, t_cmp cmp )
    {
        assert( end - begin &amp;gt;= 1 );
        &lt;span class='kw'&gt;typename&lt;/span&gt; std::iterator_traits&amp;lt;t_iter&amp;gt;::value_type val = std::move( *( end - 1 ) );
        *( end - 1 ) = std::move( *begin );
        detail::down_heap( begin, end - begin - 1, 0, std::move( val ), cmp );
    }

    &lt;span class='com'&gt;/// Same as pop_heap, but didn't move *begin to *(end-1)&lt;/span&gt;
    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_cmp&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; pop_heap_drop( t_iter begin, t_iter end, t_cmp cmp )
    {
        assert( end - begin &amp;gt;= 1 );
        detail::down_heap( begin, end - begin - 1, 0, std::move( *( end - 1 ) ), cmp );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_cmp&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; update_heap( t_iter begin, t_iter end, t_iter changed, t_cmp cmp )
    {
        assert( end - begin &amp;gt;= 1 );
        assert( begin &amp;lt;= changed &amp;amp;&amp;amp; changed &amp;lt; end );

        &lt;span class='kw'&gt;typedef typename&lt;/span&gt; std::iterator_traits&amp;lt;t_iter&amp;gt;::value_type t_value;
        &lt;span class='kw'&gt;typedef typename&lt;/span&gt; std::iterator_traits&amp;lt;t_iter&amp;gt;::difference_type t_diff;

        t_diff &lt;span class='kw'&gt;const&lt;/span&gt; idx = changed - begin;
        t_diff &lt;span class='kw'&gt;const&lt;/span&gt; parent = ( idx - 1 )/2;
        &lt;span class='kw'&gt;if&lt;/span&gt;( idx &amp;gt; 0 &amp;amp;&amp;amp; cmp( *( begin + parent ), *changed ) )
            detail::up_heap( begin, idx, std::move( *changed ), cmp );
        &lt;span class='kw'&gt;else&lt;/span&gt;
            detail::down_heap( begin, end - begin, idx, std::move( *changed ), cmp );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_cmp&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; make_heap( t_iter begin, t_iter end, t_cmp cmp )
    {
        &lt;span class='kw'&gt;typedef typename&lt;/span&gt; std::iterator_traits&amp;lt;t_iter&amp;gt;::difference_type t_diff;
        t_diff &lt;span class='kw'&gt;const&lt;/span&gt; size = end - begin;
        &lt;span class='kw'&gt;for&lt;/span&gt;( t_diff idx = size/2 - 1; idx &amp;gt;= 0; --idx )
            detail::down_heap( begin, size, idx, std::move( *( begin + idx ) ), cmp );
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; t_iter, &lt;span class='kw'&gt;typename&lt;/span&gt; t_cmp&amp;gt;
    &lt;span class='kw'&gt;inline void&lt;/span&gt; sort_heap( t_iter begin, t_iter end, t_cmp cmp )
    {
        &lt;span class='kw'&gt;while&lt;/span&gt;( end - begin &amp;gt; 1 )
            heapext::pop_heap( begin, end--, cmp );
    }
}

&lt;span class='kw'&gt;#endif&lt;/span&gt; &lt;span class='com'&gt;//heapext_h&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(http://www.rsdn.ru/Forum/images/corner.gif);background-repeat:no-repeat;background-position:center"&gt;							&lt;/td&gt;			&lt;td&gt;&lt;/td&gt;		&lt;/tr&gt;	&lt;/tbody&gt; &lt;/table&gt; &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/esKTL_ZJgBA" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Fri, 28 Jan 2011 17:52:54 GMT</pubDate>
		
			<author>rusted &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Простой SAX парсер, только в заголовочных файлах</title>
		<link>http://www.rsdn.ru/Forum/src/4108766.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4108766.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4108766.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4108766</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4108766.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4108766</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Здравствуйте, коллеги!&lt;br /&gt;
&lt;br /&gt;
 Понадобился легковесный XML SAX парсер, ничего подходящего не нашел, набросал сам. Перекодировки не поддерживает, подразумевается UTF-8 при преобразовании entities в текст, в остальном &amp;mdash; кодировка не важна. В принципе, этот момент можно обработать самому, особых проблем не вижу. Может и сам потом допилю.&lt;br /&gt;
Используется два файла &amp;mdash; rel_ASAX_Automata.h &amp;mdash; автогенеренный файл с разбирающим автоматом, simplesax.h &amp;mdash; основной файл парсера&lt;br /&gt;
(в simplesax.h нужно удалить ссылку на dbg_ASAX_Automata.h, это автомат с отладочным выводом, я его опустил тут ).&lt;br /&gt;
&lt;br /&gt;
Замечание. При наличии атрибутов у тега сначала вызывается событие startElement, затем attribute для имени атрибута и attributeValue для значения атрибута.&lt;br /&gt;
attribute и attributeValue обычно вызываются попарно, но attributeValue может не вызыватся, если атрибут не имеет значения.&lt;br /&gt;
Если тэг пустой и сам себя закрывает (&amp;lt;SomeTag/&amp;gt;), то для него будут вызваны startElement и endElement с корректным именем тэга в обоих случаях.&lt;br /&gt;
Если тэг с атрибутами сам себя закрывает (&amp;lt;SomeTag attr="val"/&amp;gt;), то для него будут вызваны startElement, attribute, attributeValue, затем endElement с пустым именем тэга.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Пример использования&lt;/b&gt;&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;struct&lt;/span&gt; CSaxPrintHandler : &lt;span class='kw'&gt;public&lt;/span&gt; ::cli::sax::CSaxDefaultHandler &lt;span class='com'&gt;// ::cli::sax::CSaxHandler&lt;/span&gt;
{
    ::std::string str(&lt;span class='kw'&gt;const char&lt;/span&gt; *p, size_t len)
       {
        &lt;span class='kw'&gt;if&lt;/span&gt; (!p || !len) &lt;span class='kw'&gt;return&lt;/span&gt; ::std::string();
        &lt;span class='kw'&gt;return&lt;/span&gt; ::std::string( p, len );
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; characters( &lt;span class='kw'&gt;const char&lt;/span&gt; *pchars, size_t len )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"Text         : "&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt; str( pchars, len );
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; cdataSection( &lt;span class='kw'&gt;const char&lt;/span&gt; *pchars, size_t len )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"CDATA        : "&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt; str( pchars, len );
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; comment( &lt;span class='kw'&gt;const char&lt;/span&gt; *pchars, size_t len )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"Comment      : "&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt; str( pchars, len );
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; startDocument()
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"Document start\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; endDocument()
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"Document end\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; startElement( &lt;span class='kw'&gt;const char&lt;/span&gt; *ns, size_t nsLen
                   , &lt;span class='kw'&gt;const char&lt;/span&gt; *elem, size_t elemLen
                   , &lt;span class='kw'&gt;const char&lt;/span&gt; *elemFull, size_t elemFullLen &lt;span class='com'&gt;// ns:tag&lt;/span&gt;
                   )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"Start element: "&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt; str( elemFull, elemFullLen )&amp;lt;&amp;lt; &lt;span class='str'&gt;" (ns: '"&lt;/span&gt;&amp;lt;&amp;lt;str(ns, nsLen)&amp;lt;&amp;lt;&lt;span class='str'&gt;"', name: '"&lt;/span&gt;&amp;lt;&amp;lt;str(elem, elemLen)&amp;lt;&amp;lt;&lt;span class='str'&gt;"')"&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; endElement( &lt;span class='kw'&gt;const char&lt;/span&gt; *ns, size_t nsLen
                   , &lt;span class='kw'&gt;const char&lt;/span&gt; *elem, size_t elemLen
                   , &lt;span class='kw'&gt;const char&lt;/span&gt; *elemFull, size_t elemFullLen &lt;span class='com'&gt;// ns:tag&lt;/span&gt;
                   )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"End element  : "&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt; str( elemFull, elemFullLen )&amp;lt;&amp;lt; &lt;span class='str'&gt;" (ns: '"&lt;/span&gt;&amp;lt;&amp;lt;str(ns, nsLen)&amp;lt;&amp;lt;&lt;span class='str'&gt;"', name: '"&lt;/span&gt;&amp;lt;&amp;lt;str(elem, elemLen)&amp;lt;&amp;lt;&lt;span class='str'&gt;"')"&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; processingInstruction( &lt;span class='kw'&gt;const char&lt;/span&gt; *pi, size_t piLen )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"PI           : "&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt; str( pi, piLen );
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; attribute( &lt;span class='kw'&gt;const char&lt;/span&gt; *ns, size_t nsLen
                   , &lt;span class='kw'&gt;const char&lt;/span&gt; *attr, size_t attrLen
                   , &lt;span class='kw'&gt;const char&lt;/span&gt; *attrFull, size_t attrFullLen &lt;span class='com'&gt;// ns:attr&lt;/span&gt;
                   )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"Attribute    : "&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt; str( attrFull, attrFullLen ) &amp;lt;&amp;lt; &lt;span class='str'&gt;" (ns: '"&lt;/span&gt;&amp;lt;&amp;lt;str(ns, nsLen)&amp;lt;&amp;lt;&lt;span class='str'&gt;"', name: '"&lt;/span&gt;&amp;lt;&amp;lt;str(attr, attrLen)&amp;lt;&amp;lt;&lt;span class='str'&gt;"')"&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"\n"&lt;/span&gt;;
       }

    &lt;span class='kw'&gt;void&lt;/span&gt; attributeValue( &lt;span class='kw'&gt;const char&lt;/span&gt; *attrVal, size_t attrValLen )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"Attribute val: "&lt;/span&gt;;
        std::cout&amp;lt;&amp;lt; str( attrVal, attrValLen );
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"\n"&lt;/span&gt;;
       }
};

...


    ::std::string data = &lt;span class='str'&gt;""&lt;/span&gt;; &lt;span class='com'&gt;// place XML here
    // RCODE res = ::cli::misc::utils::readFile( inputStreamName, data );
    // if (res) return res;&lt;/span&gt;
    
    CSaxPrintHandler handler;
    ::cli::sax::CSimpleSaxParser&amp;lt; ::cli::sax::CSaxStdStringBuffer &amp;gt; parser;

    &lt;span class='kw'&gt;if&lt;/span&gt; ( ::cli::sax::parse( &amp;amp;parser, &amp;amp;handler, data ) &amp;lt; 0 )
       {
        std::cout&amp;lt;&amp;lt;&lt;span class='str'&gt;"SAX failed\n"&lt;/span&gt;;
       }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Тестовый XML&lt;/b&gt;&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&amp;lt;&lt;span class='kw'&gt;?xml version&lt;/span&gt;=&lt;span class='str'&gt;"1.0"&lt;/span&gt;?&amp;gt;
&amp;lt;SOAP-ENV:Envelope xmlns:SOAP-ENV=&lt;span class='str'&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt; SOAP-ENV:encodingStyle=&lt;span class='str'&gt;"http://schemas.xmlsoap.org/soap/encoding/"&lt;/span&gt;&amp;gt;
&amp;lt;SOAP-ENV:Body&amp;gt;
&amp;lt;alone-with-attr attr=&lt;span class='str'&gt;"1"&lt;/span&gt;/&amp;gt;
&amp;lt;!-- Comment &lt;span class='kw'&gt;test&lt;/span&gt; 1 --&amp;gt;&amp;lt;!-- Comment &lt;span class='kw'&gt;test&lt;/span&gt; 2 --&amp;gt;
&amp;lt;![CDATA[&amp;lt;!-- Comment &lt;span class='kw'&gt;test&lt;/span&gt; 1 --&amp;gt;&amp;lt;!-- Comment &lt;span class='kw'&gt;test&lt;/span&gt; 2 --&amp;gt; ]]&amp;gt;
&amp;lt;u:GetCommonLinkProperties xmlns:u=&lt;span class='str'&gt;"urn&amp;#58;schemas&amp;#45;upnp&amp;#x2D;org&amp;#X3A;service:WANCommonInterfaceConfig:1"&lt;/span&gt;&amp;gt;
&amp;lt;NewRemoteHost xmlns:dt=&lt;span class='str'&gt;"urn:schemas-microsoft-com:datatypes"&lt;/span&gt; dt:dt=&lt;span class='str'&gt;"string"&lt;/span&gt;&amp;gt;New&amp;amp;apos;Remote&amp;#32;Host&amp;lt;/NewRemoteHost&amp;gt;
&amp;lt;NewExternalPort xmlns:dt=&lt;span class='str'&gt;"urn:schemas-microsoft-com:datatypes"&lt;/span&gt; dt:dt=&lt;span class='str'&gt;"ui2"&lt;/span&gt;&amp;gt;110&amp;lt;/NewExternalPort&amp;gt;
&amp;lt;NewProtocol xmlns:dt=&lt;span class='str'&gt;"urn:schemas-microsoft-com:datatypes"&lt;/span&gt; dt:dt=&lt;span class='str'&gt;"string"&lt;/span&gt;&amp;gt;TCP&amp;lt;/NewProtocol&amp;gt;
&amp;lt;NewInternalPort xmlns:dt=&lt;span class='str'&gt;"urn:schemas-microsoft-com:datatypes"&lt;/span&gt; dt:dt=&lt;span class='str'&gt;"ui2"&lt;/span&gt;&amp;gt;110&amp;lt;/NewInternalPort&amp;gt;
&amp;lt;NewInternalClient xmlns:dt=&lt;span class='str'&gt;"urn:schemas-microsoft-com:datatypes"&lt;/span&gt; dt:dt=&lt;span class='str'&gt;"string"&lt;/span&gt;&amp;gt;&amp;lt;/NewInternalClient&amp;gt;
&amp;lt;NewEnabled xmlns:dt=&lt;span class='str'&gt;"urn:schemas-microsoft-com:datatypes"&lt;/span&gt; dt:dt=&lt;span class='str'&gt;"boolean"&lt;/span&gt;&amp;gt;0&amp;lt;/NewEnabled&amp;gt;
&amp;lt;NewPortMappingDescription xmlns:dt=&lt;span class='str'&gt;"urn:schemas-microsoft-com:datatypes"&lt;/span&gt; dt:dt=&lt;span class='str'&gt;"string"&lt;/span&gt;&amp;gt;Virtual Server POP3&amp;lt;/NewPortMappingDescription&amp;gt;
&amp;lt;NewLeaseDuration xmlns:dt=&lt;span class='str'&gt;"urn:schemas-microsoft-com:datatypes"&lt;/span&gt; dt:dt=&lt;span class='str'&gt;"ui4"&lt;/span&gt;&amp;gt;0&amp;lt;/NewLeaseDuration&amp;gt;
&amp;lt;/u:GetCommonLinkProperties&amp;gt;
&amp;lt;/SOAP-ENV:Body&amp;gt;
&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Вывод&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class='q'&gt;&lt;p&gt;Document start&lt;br /&gt;
PI           : xml version="1.0"&lt;br /&gt;
Start element: SOAP-ENV:Envelope (ns: 'SOAP-ENV', name: 'Envelope')&lt;br /&gt;
Attribute    : xmlns:SOAP-ENV (ns: 'xmlns', name: 'SOAP-ENV')&lt;br /&gt;
Attribute val: &lt;a href="http://schemas.xmlsoap.org/soap/envelope/" class="m" target="_blank"&gt;http://schemas.xmlsoap.org/soap/envelope/&lt;/a&gt;&lt;br /&gt;
Attribute    : SOAP-ENV:encodingStyle (ns: 'SOAP-ENV', name: 'encodingStyle')&lt;br /&gt;
Attribute val: &lt;a href="http://schemas.xmlsoap.org/soap/encoding/" class="m" target="_blank"&gt;http://schemas.xmlsoap.org/soap/encoding/&lt;/a&gt;&lt;br /&gt;
Start element: SOAP-ENV:Body (ns: 'SOAP-ENV', name: 'Body')&lt;br /&gt;
Start element: alone-with-attr (ns: '', name: 'alone-with-attr')&lt;br /&gt;
Attribute    : attr (ns: '', name: 'attr')&lt;br /&gt;
Attribute val: 1&lt;br /&gt;
End element  :  (ns: '', name: '')&lt;br /&gt;
Comment      :  Comment test 1 &lt;br /&gt;
Comment      :  Comment test 2 &lt;br /&gt;
CDATA        : &amp;lt;!-- Comment test 1 --&amp;gt;&amp;lt;!-- Comment test 2 --&amp;gt; &lt;br /&gt;
Start element: u:GetCommonLinkProperties (ns: 'u', name: 'GetCommonLinkProperties')&lt;br /&gt;
Attribute    : xmlns:u (ns: 'xmlns', name: 'u')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1" class="m" target="_blank"&gt;urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1&lt;/a&gt;&lt;br /&gt;
Start element: NewRemoteHost (ns: '', name: 'NewRemoteHost')&lt;br /&gt;
Attribute    : xmlns:dt (ns: 'xmlns', name: 'dt')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-microsoft-com:datatypes" class="m" target="_blank"&gt;urn:schemas-microsoft-com:datatypes&lt;/a&gt;&lt;br /&gt;
Attribute    : dt:dt (ns: 'dt', name: 'dt')&lt;br /&gt;
Attribute val: string&lt;br /&gt;
Text         : New'Remote Host&lt;br /&gt;
End element  : NewRemoteHost (ns: '', name: 'NewRemoteHost')&lt;br /&gt;
Start element: NewExternalPort (ns: '', name: 'NewExternalPort')&lt;br /&gt;
Attribute    : xmlns:dt (ns: 'xmlns', name: 'dt')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-microsoft-com:datatypes" class="m" target="_blank"&gt;urn:schemas-microsoft-com:datatypes&lt;/a&gt;&lt;br /&gt;
Attribute    : dt:dt (ns: 'dt', name: 'dt')&lt;br /&gt;
Attribute val: ui2&lt;br /&gt;
Text         : 110&lt;br /&gt;
End element  : NewExternalPort (ns: '', name: 'NewExternalPort')&lt;br /&gt;
Start element: NewProtocol (ns: '', name: 'NewProtocol')&lt;br /&gt;
Attribute    : xmlns:dt (ns: 'xmlns', name: 'dt')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-microsoft-com:datatypes" class="m" target="_blank"&gt;urn:schemas-microsoft-com:datatypes&lt;/a&gt;&lt;br /&gt;
Attribute    : dt:dt (ns: 'dt', name: 'dt')&lt;br /&gt;
Attribute val: string&lt;br /&gt;
Text         : TCP&lt;br /&gt;
End element  : NewProtocol (ns: '', name: 'NewProtocol')&lt;br /&gt;
Start element: NewInternalPort (ns: '', name: 'NewInternalPort')&lt;br /&gt;
Attribute    : xmlns:dt (ns: 'xmlns', name: 'dt')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-microsoft-com:datatypes" class="m" target="_blank"&gt;urn:schemas-microsoft-com:datatypes&lt;/a&gt;&lt;br /&gt;
Attribute    : dt:dt (ns: 'dt', name: 'dt')&lt;br /&gt;
Attribute val: ui2&lt;br /&gt;
Text         : 110&lt;br /&gt;
End element  : NewInternalPort (ns: '', name: 'NewInternalPort')&lt;br /&gt;
Start element: NewInternalClient (ns: '', name: 'NewInternalClient')&lt;br /&gt;
Attribute    : xmlns:dt (ns: 'xmlns', name: 'dt')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-microsoft-com:datatypes" class="m" target="_blank"&gt;urn:schemas-microsoft-com:datatypes&lt;/a&gt;&lt;br /&gt;
Attribute    : dt:dt (ns: 'dt', name: 'dt')&lt;br /&gt;
Attribute val: string&lt;br /&gt;
End element  : NewInternalClient (ns: '', name: 'NewInternalClient')&lt;br /&gt;
Start element: NewEnabled (ns: '', name: 'NewEnabled')&lt;br /&gt;
Attribute    : xmlns:dt (ns: 'xmlns', name: 'dt')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-microsoft-com:datatypes" class="m" target="_blank"&gt;urn:schemas-microsoft-com:datatypes&lt;/a&gt;&lt;br /&gt;
Attribute    : dt:dt (ns: 'dt', name: 'dt')&lt;br /&gt;
Attribute val: boolean&lt;br /&gt;
Text         : 0&lt;br /&gt;
End element  : NewEnabled (ns: '', name: 'NewEnabled')&lt;br /&gt;
Start element: NewPortMappingDescription (ns: '', name: 'NewPortMappingDescription')&lt;br /&gt;
Attribute    : xmlns:dt (ns: 'xmlns', name: 'dt')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-microsoft-com:datatypes" class="m" target="_blank"&gt;urn:schemas-microsoft-com:datatypes&lt;/a&gt;&lt;br /&gt;
Attribute    : dt:dt (ns: 'dt', name: 'dt')&lt;br /&gt;
Attribute val: string&lt;br /&gt;
Text         : Virtual Server POP3&lt;br /&gt;
End element  : NewPortMappingDescription (ns: '', name: 'NewPortMappingDescription')&lt;br /&gt;
Start element: NewLeaseDuration (ns: '', name: 'NewLeaseDuration')&lt;br /&gt;
Attribute    : xmlns:dt (ns: 'xmlns', name: 'dt')&lt;br /&gt;
Attribute val: &lt;a href="urn:schemas-microsoft-com:datatypes" class="m" target="_blank"&gt;urn:schemas-microsoft-com:datatypes&lt;/a&gt;&lt;br /&gt;
Attribute    : dt:dt (ns: 'dt', name: 'dt')&lt;br /&gt;
Attribute val: ui4&lt;br /&gt;
Text         : 0&lt;br /&gt;
End element  : NewLeaseDuration (ns: '', name: 'NewLeaseDuration')&lt;br /&gt;
End element  : u:GetCommonLinkProperties (ns: 'u', name: 'GetCommonLinkProperties')&lt;br /&gt;
End element  : SOAP-ENV:Body (ns: 'SOAP-ENV', name: 'Body')&lt;br /&gt;
End element  : SOAP-ENV:Envelope (ns: 'SOAP-ENV', name: 'Envelope')&lt;br /&gt;
Document end&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/MA-V-bACjv8" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Sat, 08 Jan 2011 18:20:42 GMT</pubDate>
		
			<author>Marty &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>6</slash:comments>
		
	</item>

	<item>
		<title>Template Endian  Switcher</title>
		<link>http://www.rsdn.ru/Forum/src/4108653.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4108653.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4108653.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4108653</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4108653.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4108653</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Пара вопросов по данному коду:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;int&lt;/span&gt; size&amp;gt;
&lt;span class='kw'&gt;struct&lt;/span&gt; Endian
{
  &lt;span class='kw'&gt;static inline void&lt;/span&gt; Switch(&lt;span class='kw'&gt;void&lt;/span&gt; * buff);
};
&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;int&lt;/span&gt; size&amp;gt;  
&lt;span class='kw'&gt;inline void&lt;/span&gt; Endian&amp;lt;size&amp;gt;::Switch(&lt;span class='kw'&gt;void&lt;/span&gt; * buff)
  {
    std::swap(((&lt;span class='kw'&gt;char&lt;/span&gt;*)buff)[0], ((&lt;span class='kw'&gt;char&lt;/span&gt;*)buff)[size-1]);
    Endian&amp;lt;size-2&amp;gt;::Switch((&lt;span class='kw'&gt;char&lt;/span&gt;*)buff + 1);
  }

&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&amp;gt;
&lt;span class='kw'&gt;inline void&lt;/span&gt; Endian&amp;lt;0&amp;gt;::Switch(&lt;span class='kw'&gt;void&lt;/span&gt; * ){}

&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; T&amp;gt;
&lt;span class='kw'&gt;void&lt;/span&gt; SwitchEndian(T * value, size_t count = 1)
{
  &lt;span class='kw'&gt;for&lt;/span&gt; (size_t i =0; i &amp;lt; count; ++i)
    Endian&amp;lt;&lt;span class='kw'&gt;sizeof&lt;/span&gt;(T)&amp;gt;::Switch(value+i);
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
Во первых, оно будет корректно работать?&lt;br /&gt;
Во вторых, чем оно лучше/хуже обёртки вокруг hton и ко.?&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/OjhPu6Pmxb8" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Sat, 08 Jan 2011 15:31:46 GMT</pubDate>
		
			<author>Caracrist &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>Небольшой</title>
		<link>http://www.rsdn.ru/Forum/src/4087675.1.aspx</link>
		<guid isPermaLink="true">http://www.rsdn.ru/Forum/src/4087675.aspx</guid>
		<comments>http://www.rsdn.ru/Forum/src/4087675.aspx</comments>
		<wfw:comment>http://www.rsdn.ru/Forum/PostRssComment.aspx?mid=4087675</wfw:comment>
		<wfw:commentRss>http://www.rsdn.ru/Forum/RSS/4087675.aspx</wfw:commentRss>
		<trackback:ping>http://www.rsdn.ru/Forum/Trackback.aspx?mid=4087675</trackback:ping>
		<description>&lt;div style="@import url(http://www.rsdn.ru/Forum/Forum.css);"&gt;Предыстория.&lt;br /&gt;
Был найден такой кусочек кода:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
DWORD info_length = 0;

&lt;span class='kw'&gt;if&lt;/span&gt; ( !::GetTokenInformation( token.handle(), TokenGroups, 0, 0, &amp;amp;info_length ) &amp;amp;&amp;amp; 
                            ERROR_INSUFFICIENT_BUFFER != ::GetLastError() )
    &lt;span class='kw'&gt;throw&lt;/span&gt; an_exception( ::GetLastError() );

std::vector&amp;lt;BYTE&amp;gt; buffer( info_length );   

&lt;span class='kw'&gt;if&lt;/span&gt; ( !::GetTokenInformation( token.handle(), TokenGroups, &amp;amp;buffer[0], info_length, &amp;amp;info_length ) )
    &lt;span class='kw'&gt;throw&lt;/span&gt; an_exception( ::GetLastError() );&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
Это далеко не единственная winapi, которая возвращает размер буфера для своей работы. Но данный случай интересен тем, что далее:&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
PTOKEN_GROUPS  pGroups = &lt;span class='kw'&gt;reinterpret_cast&lt;/span&gt;&amp;lt;PTOKEN_GROUPS&amp;gt;( &amp;amp;buffer[0] ); 

&lt;span class='kw'&gt;for&lt;/span&gt; ( DWORD i = 0; i &amp;lt; pGroups-&amp;gt;GroupCount &amp;amp;&amp;amp; !m_admin; ++ i )
{
    &lt;span class='kw'&gt;if&lt;/span&gt; ( ::EqualSid( psid, pGroups-&amp;gt;Groups[i].Sid ) )
        m_admin = &lt;span class='kw'&gt;true&lt;/span&gt;;
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
То есть помимо часто повторяемой процедуры запроса размера буфера, выделения и использования здесь присутствует кастинг (плата за вектор).&lt;br /&gt;
Был написан небольшой класс, инкапсулирующий действия с ресайзами и кастингом.&lt;br /&gt;
Сперва покажу его в действии, а затем приведу листинг.&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
smart_buffer&amp;lt;PTOKEN_GROUPS,DWORD&amp;gt; buffer;

&lt;span class='kw'&gt;if&lt;/span&gt; ( !::GetTokenInformation( token.handle(), TokenGroups, 0, 0, buffer.psize() ) )
{
    DWORD err_code = ::GetLastError();

    &lt;span class='kw'&gt;if&lt;/span&gt; ( ERROR_INSUFFICIENT_BUFFER != err_code )
        &lt;span class='kw'&gt;throw&lt;/span&gt; an_exception( err_code );

    &lt;span class='kw'&gt;if&lt;/span&gt; ( !::GetTokenInformation( token.handle(), TokenGroups, buffer, buffer.size(), buffer.psize() ) )
        &lt;span class='kw'&gt;throw&lt;/span&gt; an_exception( ::GetLastError() );
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
Конечно же, кастинг никуда не делся. По крайней мере, он не мозолит глаз в клиентском коде.&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;for&lt;/span&gt; ( DWORD i = 0; i &amp;lt; buffer-&amp;gt;GroupCount &amp;amp;&amp;amp; !m_admin; ++ i )
{
    &lt;span class='kw'&gt;if&lt;/span&gt; ( ::EqualSid( psid, buffer-&amp;gt;Groups[i].Sid ) )
        m_admin = &lt;span class='kw'&gt;true&lt;/span&gt;;
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Сам класс:&lt;br /&gt;
&lt;br /&gt;
&lt;table width='96%'&gt;&lt;tr&gt;&lt;td nowrap='nowrap' class='c'&gt;&lt;pre&gt;
&lt;span class='kw'&gt;typedef&lt;/span&gt; std::vector&amp;lt;BYTE&amp;gt; buffer; 

&lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; T, &lt;span class='kw'&gt;typename&lt;/span&gt; sizeT = buffer::size_type&amp;gt;
&lt;span class='kw'&gt;class&lt;/span&gt; smart_buffer : buffer
{
    &lt;span class='kw'&gt;friend class&lt;/span&gt; buffer_size_proxy;

&lt;span class='kw'&gt;public&lt;/span&gt;:

    &lt;span class='kw'&gt;typedef&lt;/span&gt; T        value_type;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; sizeT    size_type;

    &lt;span class='kw'&gt;using&lt;/span&gt; buffer::size;

    &lt;span class='kw'&gt;template&lt;/span&gt; &amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; BufferT&amp;gt;
    &lt;span class='kw'&gt;class&lt;/span&gt; buffer_size_proxy
    {
        BufferT&amp;amp; buffer_;
        &lt;span class='kw'&gt;typename&lt;/span&gt; BufferT::size_type size_; 
        &lt;span class='kw'&gt;typename const&lt;/span&gt; BufferT::size_type initial_size_; 
        size_t ref_cnt_;

    &lt;span class='kw'&gt;public&lt;/span&gt;:
        buffer_size_proxy( BufferT&amp;amp; buffer )
            :    buffer_( buffer ),
                size_( buffer.size() ),
                initial_size_( size_ ),
                ref_cnt_( 1 )
        {
        }

        ~buffer_size_proxy()
        {
            &lt;span class='kw'&gt;if&lt;/span&gt; ( 0 == -- ref_cnt_ &amp;amp;&amp;amp; initial_size_ &amp;lt; size_ )
                buffer_.resize( size_ );
        }
        
        buffer_size_proxy( &lt;span class='kw'&gt;const&lt;/span&gt; buffer_size_proxy&amp;amp; rhs )
            :    buffer_( rhs.buffer_ ),
                size_( rhs.size_ ),
                ref_cnt_( rhs.ref_cnt_ + 1 )
        {
        }

        &lt;span class='kw'&gt;operator typename&lt;/span&gt; BufferT::size_type * ()
        {
            &lt;span class='kw'&gt;return&lt;/span&gt; &amp;amp;size_;
        }
    };

&lt;span class='kw'&gt;public&lt;/span&gt;:

    smart_buffer() 
    {
    }

    smart_buffer( size_type initial_size )
        :    buffer( initial_size )
    {
    }

    buffer_size_proxy&amp;lt;smart_buffer&amp;lt;T,sizeT&amp;gt;&amp;gt; psize()
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; buffer_size_proxy&amp;lt;smart_buffer&amp;gt;( *&lt;span class='kw'&gt;this&lt;/span&gt; );
    }

    &lt;span class='kw'&gt;operator&lt;/span&gt; T()
    {
        &lt;span class='kw'&gt;return reinterpret_cast&lt;/span&gt;&amp;lt;T&amp;gt;( &amp;amp;&lt;span class='kw'&gt;operator&lt;/span&gt;[]( 0 ) );
    }

    &lt;span class='kw'&gt;const&lt;/span&gt; T &lt;span class='kw'&gt;operator&lt;/span&gt; -&amp;gt; ()
    {
        &lt;span class='kw'&gt;return reinterpret_cast&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;const&lt;/span&gt; T&amp;gt;( &amp;amp;at( 0 ) );
    }
};&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Идея заключается в использовании временного прокси-объекта, неявно управляющего выделением памяти. Нет надобности заводить вспомогательные переменные и делать кастинг. Да и вообще &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/smile.gif' /&gt;&lt;br /&gt;
Написано в некоторой спешке, критика горячо приветствуется.&lt;br /&gt;
Спасибо за внимание. &lt;img border='0' width='15' height='15' src='http://www.rsdn.ru/Forum/images/smile.gif' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rsdn/src/~4/RdWP6v4rZIA" height="1" width="1"/&gt;</description>
		
		<category>src</category>
		<pubDate>Tue, 21 Dec 2010 17:01:57 GMT</pubDate>
		
			<author>NiJazz &lt;forum@rsdn.ru&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>
</channel>
</rss>

