<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 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/">
  <channel>
    <title>Форум 'Исходники' на RSDN</title>
    <link>http://rsdn.org/Forum/src/</link>
    <description>Поделитесь вашими исходниками с коллегами.</description>
    <category>src</category>
    <language>ru-ru</language>
    <copyright>Copyright ©, RSDN, 2001-2007</copyright>
    <webMaster>forum@rsdn.org</webMaster>
    <generator>RSDN RSS Generator 1.3</generator>
    <image>
      <url>http://rsdn.org/rsdn.gif</url>
      <title>RSDN</title>
      <link>http://rsdn.org</link>
    </image>
    <lastBuildDate>Wed, 22 Apr 2026 09:43:39 GMT</lastBuildDate>
    <ttl>5</ttl>
	<item>
		<title>Генерация динамической превью для демонстрации картинки</title>
		<link>http://rsdn.org/Forum/src/9057350.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/9057350</guid>
		<comments>http://rsdn.org/Forum/src/9057350</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=9057350</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/9057350</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=9057350</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;&lt;pre class='c'&gt;&lt;code&gt;&amp;lt;?php
&lt;span class='com'&gt;// big2small.php&lt;/span&gt;
&lt;span class='kw'&gt;if&lt;/span&gt;(&lt;span class='kw'&gt;isset&lt;/span&gt;($_GET[&lt;span class='str'&gt;'pixmap'&lt;/span&gt;]))$pixmap=$_GET[&lt;span class='str'&gt;'pixmap'&lt;/span&gt;];
&lt;span class='kw'&gt;else exit&lt;/span&gt;();
&lt;span class='com'&gt;/* echo $pixmap."&amp;lt;br&amp;gt;";
exit(); */&lt;/span&gt;
&lt;span class='kw'&gt;list&lt;/span&gt;($w0,$h0,$type,$attr)=getimagesize($pixmap);
&lt;span class='com'&gt;/* echo "&amp;lt;img src="$pixmap" $attr&amp;gt;&amp;lt;/img&amp;gt;";
exit(); */&lt;/span&gt;

$w=200;&lt;span class='com'&gt;// Размер трекера и ширина превью.&lt;/span&gt;
$rt=$w/$w0;&lt;span class='com'&gt;// Коэффициент для пересчёта высоты превью.&lt;/span&gt;

&lt;span class='kw'&gt;switch&lt;/span&gt;($type){
&lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_JPEG:
        $img=imagecreatefromjpeg($pixmap);
        &lt;span class='kw'&gt;break&lt;/span&gt;;
&lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_GIF:
        $img=imagecreatefromgif($pixmap);
        &lt;span class='kw'&gt;break&lt;/span&gt;;
&lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_PNG:
        $img=imagecreatefrompng($pixmap);
        &lt;span class='kw'&gt;break&lt;/span&gt;;
&lt;span class='kw'&gt;default&lt;/span&gt;:&lt;span class='kw'&gt;exit&lt;/span&gt;();}
&lt;span class='kw'&gt;if&lt;/span&gt;($rt&amp;lt;1){&lt;span class='com'&gt;// Картинка не поместится в трекер:
        // 1) перерисовываем с сохранением пропорций,&lt;/span&gt;
        $h=round($h0*$rt);&lt;span class='com'&gt;// высоту надо округлить до целого;&lt;/span&gt;
        $img0=imagecreatetruecolor($w,$h);
        imagecopyresized($img0,$img,0,0,0,0,$w,$h,$w0,$h0);
        &lt;span class='com'&gt;// 2) показываем превью.&lt;/span&gt;
        &lt;span class='kw'&gt;switch&lt;/span&gt;($type){
        &lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_JPEG:
                Header(&lt;span class='str'&gt;"Content-type: image/jpeg"&lt;/span&gt;);
                imagejpeg($img0);
                &lt;span class='kw'&gt;break&lt;/span&gt;;
        &lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_GIF:
                Header(&lt;span class='str'&gt;"Content-type: image/gif"&lt;/span&gt;);
                imagegif($img0);
                &lt;span class='kw'&gt;break&lt;/span&gt;;
        &lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_PNG:
                Header(&lt;span class='str'&gt;"Content-type: image/png"&lt;/span&gt;);
                imagepng($img0);
                &lt;span class='kw'&gt;break&lt;/span&gt;;
        &lt;span class='kw'&gt;default&lt;/span&gt;:&lt;span class='kw'&gt;exit&lt;/span&gt;();}}
&lt;span class='kw'&gt;else&lt;/span&gt;{&lt;span class='com'&gt;// Картинка поместится в трекер:
        // ничего не делаем, показываем оригинал.&lt;/span&gt;
        &lt;span class='kw'&gt;switch&lt;/span&gt;($type){
        &lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_JPEG:
                Header(&lt;span class='str'&gt;"Content-type: image/jpeg"&lt;/span&gt;);
                imagejpeg($img);
                &lt;span class='kw'&gt;break&lt;/span&gt;;
        &lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_GIF:
                Header(&lt;span class='str'&gt;"Content-type: image/gif"&lt;/span&gt;);
                imagegif($img);
                &lt;span class='kw'&gt;break&lt;/span&gt;;
        &lt;span class='kw'&gt;case&lt;/span&gt; IMAGETYPE_PNG:
                Header(&lt;span class='str'&gt;"Content-type: image/png"&lt;/span&gt;);
                imagepng($img);
                &lt;span class='kw'&gt;break&lt;/span&gt;;
        &lt;span class='kw'&gt;default&lt;/span&gt;:&lt;span class='kw'&gt;exit&lt;/span&gt;();}}
imagedestroy($img);
imagedestroy($img0);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Использовать:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&amp;lt;img src=&lt;span class='str'&gt;"http://192.168.24.80:8080/tuxoid/big2small.php?pixmap=http://i56.tinypic.com/28211yx.png"&lt;/span&gt; border=&lt;span class='str'&gt;"0"&lt;/span&gt;&amp;gt;&amp;lt;/img&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Нужна GD.&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Tue, 17 Feb 2026 13:00:15 GMT</pubDate>
		
			<author>arc041209 &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Decimal for C++</title>
		<link>http://rsdn.org/Forum/src/7913598.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/7913598</guid>
		<comments>http://rsdn.org/Forum/src/7913598</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=7913598</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/7913598</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=7913598</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Здравствуйте!&lt;br /&gt;
&lt;br /&gt;
Неохота было что-то искать, накидал на скорую руку&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;#pragma&lt;/span&gt; once


&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;string&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;cstdint&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;limits&amp;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;exception&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;stdexcept&amp;gt;


&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;namespace&lt;/span&gt; marty
{



&lt;span class='com'&gt;//----------------------------------------------------------------------------
// 4 294 967 295 uint32_t max
// 1 000 000 000 - must be enough for money or use more wide type in typedef below&lt;/span&gt;

&lt;span class='kw'&gt;typedef&lt;/span&gt; std::uint32_t  DecimalDenumeratorRawType;
&lt;span class='kw'&gt;typedef&lt;/span&gt; std::int32_t   DecimalDenumeratorSignedRawType;

&lt;span class='com'&gt;//----------------------------------------------------------------------------
//  9 223 372 036 854 775 808
//  1 000 000 000.000 000  000 - 10**9 -  миллиард - бюджет страны верстать не выйдет с точностью 9 нулей после точки
//  1 000 000 000 000 00.0 000 - 10**15 - 100 трлн с точностью до сотых копейки - для домашней бухгалтерии норм&lt;/span&gt;

&lt;span class='kw'&gt;typedef&lt;/span&gt; std::int64_t   DecimalNumeratorRawType;



&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;class&lt;/span&gt; DecimalDenumerator;

&lt;span class='kw'&gt;class&lt;/span&gt; DecimalPrecision
{
    &lt;span class='kw'&gt;friend class&lt;/span&gt; DecimalDenumerator;

    std::uint32_t m_precision;

    &lt;span class='com'&gt;// default constructor disabled&lt;/span&gt;
    DecimalPrecision( );
    &lt;span class='com'&gt;//DecimalPrecision&amp;amp; operator=( const DecimalPrecision &amp;amp;dp );&lt;/span&gt;

&lt;span class='kw'&gt;public&lt;/span&gt;:

    &lt;span class='kw'&gt;typedef&lt;/span&gt; std::uint32_t                    precision_t;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalDenumeratorRawType        denum_t;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalDenumeratorSignedRawType  sdenum_t;

    &lt;span class='kw'&gt;static&lt;/span&gt; denum_t denum( precision_t pr )
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; ( maxPrecision&amp;lt;denum_t&amp;gt;() &amp;lt; pr )
            &lt;span class='kw'&gt;throw&lt;/span&gt; std::runtime_error(&lt;span class='str'&gt;"DecimalPrecision::denum - taken precision to big"&lt;/span&gt;);

        &lt;span class='kw'&gt;return&lt;/span&gt; (denum_t)(getPowers10Table()[pr]);

        &lt;span class='com'&gt;/*
        denum_t  denum = 1;
        for(precision_t i=0; i!=pr; ++i)
        {
            denum_t next = denum * 10u;
            if (next&amp;lt;denum)
                throw std::runtime_error("DecimalPrecision precision to big");
            denum = next;
        }

        return denum;
        */&lt;/span&gt;
    }

    DecimalPrecision( std::uint32_t pr ) : m_precision(pr) {}
    DecimalPrecision( &lt;span class='kw'&gt;const&lt;/span&gt; DecimalPrecision &amp;amp;pr ) : m_precision(pr.m_precision) {}

    denum_t denum( ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; denum(m_precision);
    }

    precision_t prec() &lt;span class='kw'&gt;const&lt;/span&gt; 
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; m_precision;
    }

&lt;span class='kw'&gt;protected&lt;/span&gt;:

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; IntType&amp;gt;
    &lt;span class='kw'&gt;static&lt;/span&gt; precision_t maxPrecision()    { &lt;span class='kw'&gt;throw&lt;/span&gt; std::runtime_error(&lt;span class='str'&gt;"DecimalPrecision::maxPrecision not implemented"&lt;/span&gt;); }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class='kw'&gt;static&lt;/span&gt; precision_t maxPrecision&amp;lt;std::int32_t &amp;gt;() { &lt;span class='kw'&gt;return&lt;/span&gt;  9; }
    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class='kw'&gt;static&lt;/span&gt; precision_t maxPrecision&amp;lt;std::uint32_t&amp;gt;() { &lt;span class='kw'&gt;return&lt;/span&gt;  9; }
    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class='kw'&gt;static&lt;/span&gt; precision_t maxPrecision&amp;lt;std::int64_t &amp;gt;() { &lt;span class='kw'&gt;return&lt;/span&gt; 18; }
    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&amp;gt; &lt;span class='kw'&gt;static&lt;/span&gt; precision_t maxPrecision&amp;lt;std::uint64_t&amp;gt;() { &lt;span class='kw'&gt;return&lt;/span&gt; 18; }


    &lt;span class='kw'&gt;static&lt;/span&gt; std::uint64_t* getPowers10Table()
    {
        &lt;span class='kw'&gt;static&lt;/span&gt; std::uint64_t _[] = 
        { 1                             &lt;span class='com'&gt;//  0&lt;/span&gt;
        , 10                            &lt;span class='com'&gt;//  1&lt;/span&gt;
        , 100                           &lt;span class='com'&gt;//  2&lt;/span&gt;
        , 1000                          &lt;span class='com'&gt;//  3&lt;/span&gt;
        , 10000                         &lt;span class='com'&gt;//  4&lt;/span&gt;
        , 100000                        &lt;span class='com'&gt;//  5&lt;/span&gt;
        , 1000000                       &lt;span class='com'&gt;//  6&lt;/span&gt;
        , 10000000                      &lt;span class='com'&gt;//  7&lt;/span&gt;
        , 100000000                     &lt;span class='com'&gt;//  8&lt;/span&gt;
        , 1000000000                    &lt;span class='com'&gt;//  9 - max for int32_t&lt;/span&gt;
        , 10000000000                   &lt;span class='com'&gt;// 10&lt;/span&gt;
        , 100000000000                  &lt;span class='com'&gt;// 11&lt;/span&gt;
        , 1000000000000                 &lt;span class='com'&gt;// 12&lt;/span&gt;
        , 10000000000000                &lt;span class='com'&gt;// 13&lt;/span&gt;
        , 100000000000000               &lt;span class='com'&gt;// 14&lt;/span&gt;
        , 1000000000000000              &lt;span class='com'&gt;// 15&lt;/span&gt;
        , 10000000000000000             &lt;span class='com'&gt;// 16&lt;/span&gt;
        , 100000000000000000            &lt;span class='com'&gt;// 17&lt;/span&gt;
        , 1000000000000000000           &lt;span class='com'&gt;// 18 - max for int64_t&lt;/span&gt;
        };
    
        &lt;span class='kw'&gt;return&lt;/span&gt; &amp;amp;_[0];
    }


}; &lt;span class='com'&gt;// class DecimalPrecision

//----------------------------------------------------------------------------&lt;/span&gt;



&lt;span class='kw'&gt;#define&lt;/span&gt; MARTY_DECIMAL_IMPLEMENT_RELATIONAL_OPERATORS( typeT2 )\
                                                              \
    &lt;span class='kw'&gt;bool operator&lt;/span&gt;&amp;lt;( &lt;span class='kw'&gt;const&lt;/span&gt; typeT2 v2 ) &lt;span class='kw'&gt;const&lt;/span&gt;                   \
    {                                                         \
        &lt;span class='kw'&gt;return&lt;/span&gt; compare(v2)&amp;lt;0;                                 \
    }                                                         \
                                                              \
    &lt;span class='kw'&gt;bool operator&lt;/span&gt;&amp;lt;=( &lt;span class='kw'&gt;const&lt;/span&gt; typeT2 v2 ) &lt;span class='kw'&gt;const&lt;/span&gt;                  \
    {                                                         \
        &lt;span class='kw'&gt;return&lt;/span&gt; compare(v2)&amp;lt;=0;                                \
    }                                                         \
                                                              \
    &lt;span class='kw'&gt;bool operator&lt;/span&gt;&amp;gt;( &lt;span class='kw'&gt;const&lt;/span&gt; typeT2 v2 ) &lt;span class='kw'&gt;const&lt;/span&gt;                   \
    {                                                         \
        &lt;span class='kw'&gt;return&lt;/span&gt; compare(v2)&amp;gt;0;                                 \
    }                                                         \
                                                              \
    &lt;span class='kw'&gt;bool operator&lt;/span&gt;&amp;gt;=( &lt;span class='kw'&gt;const&lt;/span&gt; typeT2 v2 ) &lt;span class='kw'&gt;const&lt;/span&gt;                  \
    {                                                         \
        &lt;span class='kw'&gt;return&lt;/span&gt; compare(v2)&amp;gt;=0;                                \
    }                                                         \
                                                              \
    &lt;span class='kw'&gt;bool operator&lt;/span&gt;==( &lt;span class='kw'&gt;const&lt;/span&gt; typeT2 v2 ) &lt;span class='kw'&gt;const&lt;/span&gt;                  \
    {                                                         \
        &lt;span class='kw'&gt;return&lt;/span&gt; compare(v2)==0;                                \
    }                                                         \
                                                              \
    &lt;span class='kw'&gt;bool operator&lt;/span&gt;!=( &lt;span class='kw'&gt;const&lt;/span&gt; typeT2 v2 ) &lt;span class='kw'&gt;const&lt;/span&gt;                  \
    {                                                         \
        &lt;span class='kw'&gt;return&lt;/span&gt; compare(v2)!=0;                                \
    }





&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;class&lt;/span&gt; Decimal;

&lt;span class='kw'&gt;class&lt;/span&gt; DecimalDenumerator
{

&lt;span class='kw'&gt;public&lt;/span&gt;:

    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalPrecision::denum_t       denum_t    ;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalPrecision::sdenum_t      sdenum_t   ;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalPrecision::precision_t   precision_t;

    &lt;span class='kw'&gt;friend class&lt;/span&gt; Decimal;

    DecimalDenumerator( &lt;span class='kw'&gt;const&lt;/span&gt; DecimalPrecision dp )
    : m_precision( dp.prec() )
    , m_denum    ( dp.denum() )
    {}

    DecimalDenumerator( &lt;span class='kw'&gt;const&lt;/span&gt; DecimalDenumerator &amp;amp;dd )
    : m_precision( dd.m_precision )
    , m_denum    ( dd.m_denum     )
    {}

    DecimalDenumerator&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;=( &lt;span class='kw'&gt;const&lt;/span&gt; DecimalDenumerator &amp;amp;dd )
    {
        m_precision = dd.m_precision;
        m_denum     = dd.m_denum    ;
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }

    precision_t prec () &lt;span class='kw'&gt;const&lt;/span&gt; { &lt;span class='kw'&gt;return&lt;/span&gt; m_precision; }
    denum_t     denum() &lt;span class='kw'&gt;const&lt;/span&gt; { &lt;span class='kw'&gt;return&lt;/span&gt; m_denum; }

    DecimalPrecision decimalPrecision( ) &lt;span class='kw'&gt;const&lt;/span&gt; { &lt;span class='kw'&gt;return&lt;/span&gt; DecimalPrecision(m_precision); }

    &lt;span class='kw'&gt;void&lt;/span&gt; swap( DecimalDenumerator &amp;amp;d2 )
    {
        &lt;span class='com'&gt;//using namespace std;&lt;/span&gt;
        std::swap( m_precision, d2.m_precision );
        std::swap( m_denum    , d2.m_denum     );
    }

    &lt;span class='kw'&gt;int&lt;/span&gt; compare( &lt;span class='kw'&gt;const&lt;/span&gt; DecimalDenumerator d2 ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; (m_precision&amp;lt;d2.m_precision) &lt;span class='kw'&gt;return&lt;/span&gt; -1;
        &lt;span class='kw'&gt;if&lt;/span&gt; (m_precision&amp;gt;d2.m_precision) &lt;span class='kw'&gt;return&lt;/span&gt;  1;
        &lt;span class='kw'&gt;return&lt;/span&gt; 0;
    }

    MARTY_DECIMAL_IMPLEMENT_RELATIONAL_OPERATORS(DecimalDenumerator)


&lt;span class='kw'&gt;protected&lt;/span&gt;:

    &lt;span class='kw'&gt;void&lt;/span&gt; incPrec()
    {
        tryIncDenum();
        m_precision += 1;
    }

    &lt;span class='kw'&gt;void&lt;/span&gt; decPrec()
    {
        tryDecDenum();
        m_precision -= 1;
    }

    denum_t expandTo( precision_t p )
    {
        denum_t deltaDenum = 1;
        &lt;span class='kw'&gt;while&lt;/span&gt;(m_precision &amp;lt; p)
        {
            incPrec();
            deltaDenum *= 10;
        }

        &lt;span class='kw'&gt;return&lt;/span&gt; deltaDenum;
    }

    denum_t shrinkTo( precision_t p )
    {
        denum_t deltaDenum = 1;
        &lt;span class='kw'&gt;while&lt;/span&gt;(m_precision &amp;gt; p)
        {
            decPrec();
            deltaDenum *= 10;
        }

        &lt;span class='kw'&gt;return&lt;/span&gt; deltaDenum;
    }

    sdenum_t fitTo( precision_t p )
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; (m_precision&amp;lt;p)
            &lt;span class='kw'&gt;return&lt;/span&gt;   (sdenum_t)expandTo(p);
        &lt;span class='kw'&gt;else
            return&lt;/span&gt; - (sdenum_t)shrinkTo(p);
    }


    &lt;span class='kw'&gt;void&lt;/span&gt; tryIncDenum()
    {
        denum_t newDenum = m_denum*10u;
        &lt;span class='kw'&gt;if&lt;/span&gt; (newDenum&amp;lt;m_denum)
            &lt;span class='kw'&gt;throw&lt;/span&gt; std::runtime_error(&lt;span class='str'&gt;"DecimalDenumerator precision to big to increment"&lt;/span&gt;);
        m_denum = newDenum;
    }

    &lt;span class='kw'&gt;void&lt;/span&gt; tryDecDenum()
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; (!m_denum)
            &lt;span class='kw'&gt;throw&lt;/span&gt; std::runtime_error(&lt;span class='str'&gt;"DecimalDenumerator precision to small to decrement"&lt;/span&gt;);
        m_denum = m_denum / 10u;
    }


    &lt;span class='com'&gt;// default constructor disabled&lt;/span&gt;
    DecimalDenumerator();

    precision_t  m_precision;
    denum_t      m_denum;

}; &lt;span class='com'&gt;// class DecimalDenumerator

//----------------------------------------------------------------------------




//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;inline
void&lt;/span&gt; swap( DecimalDenumerator &amp;amp;d1, DecimalDenumerator &amp;amp;d2 )
{
    d1.swap( d2 );
}

&lt;span class='com'&gt;//----------------------------------------------------------------------------




//----------------------------------------------------------------------------&lt;/span&gt;
std::string toString  ( &lt;span class='kw'&gt;const&lt;/span&gt; Decimal     &amp;amp;d );
Decimal     fromString( &lt;span class='kw'&gt;const&lt;/span&gt; std::string &amp;amp;d );
&lt;span class='kw'&gt;void&lt;/span&gt; swap( Decimal &amp;amp;d1, Decimal &amp;amp;d2 );

&lt;span class='com'&gt;//----------------------------------------------------------------------------




//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;class&lt;/span&gt; Decimal
{

    &lt;span class='kw'&gt;friend&lt;/span&gt; std::string toString  ( &lt;span class='kw'&gt;const&lt;/span&gt; Decimal     &amp;amp;d );
    &lt;span class='kw'&gt;friend&lt;/span&gt; Decimal     fromString( &lt;span class='kw'&gt;const&lt;/span&gt; std::string &amp;amp;d );
    &lt;span class='kw'&gt;friend void&lt;/span&gt; swap( Decimal &amp;amp;d1, Decimal &amp;amp;d2 );


&lt;span class='kw'&gt;public&lt;/span&gt;:

    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalNumeratorRawType           num_t      ;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalDenumerator::denum_t       denum_t    ;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalDenumerator::sdenum_t      sdenum_t   ;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalDenumerator::precision_t   precision_t;

    &lt;span class='kw'&gt;typedef&lt;/span&gt; DecimalDenumerator                DenumeratorType;

    Decimal()                   : m_num(0)      , m_denum(DecimalPrecision(0))   {}
    Decimal( &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) : m_num(d.m_num), m_denum(d.m_denum)             {}
    Decimal( &lt;span class='kw'&gt;int&lt;/span&gt;            v, &lt;span class='kw'&gt;const&lt;/span&gt; DecimalPrecision &amp;amp;prec = DecimalPrecision(0) ) : m_num(v), m_denum(prec) { m_num *= m_denum.denum(); }
    Decimal( &lt;span class='kw'&gt;unsigned&lt;/span&gt;       v, &lt;span class='kw'&gt;const&lt;/span&gt; DecimalPrecision &amp;amp;prec = DecimalPrecision(0) ) : m_num(v), m_denum(prec) { m_num *= m_denum.denum(); }
    Decimal( std::int64_t   v, &lt;span class='kw'&gt;const&lt;/span&gt; DecimalPrecision &amp;amp;prec = DecimalPrecision(0) ) : m_num(v), m_denum(prec) { m_num *= m_denum.denum(); }
    Decimal( std::uint64_t  v, &lt;span class='kw'&gt;const&lt;/span&gt; DecimalPrecision &amp;amp;prec = DecimalPrecision(0) ) : m_num(v), m_denum(prec) { m_num *= m_denum.denum(); }

    Decimal( &lt;span class='kw'&gt;float&lt;/span&gt;          f, &lt;span class='kw'&gt;const&lt;/span&gt; DecimalPrecision &amp;amp;prec = DecimalPrecision(0) )
    : m_num(0), m_denum(prec)
    {
        fromFloat( f, prec );
    }

    Decimal( &lt;span class='kw'&gt;double&lt;/span&gt;          f, &lt;span class='kw'&gt;const&lt;/span&gt; DecimalPrecision &amp;amp;prec = DecimalPrecision(0) )
    : m_num(0), m_denum(prec)
    {
        fromFloat( f, prec );
    }

    &lt;span class='kw'&gt;void&lt;/span&gt; swap( Decimal &amp;amp;d2 )
    {
        &lt;span class='com'&gt;//using namespace std;&lt;/span&gt;
        std::swap( m_num   , d2.m_num   );
        m_denum.swap( d2.m_denum );
    }


    Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;=( Decimal d2 )
    {
        swap(d2);
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }

    &lt;span class='com'&gt;// операторы преобразования типа &lt;/span&gt;

    &lt;span class='kw'&gt;explicit operator int&lt;/span&gt;() &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt;)(m_num/m_denum.denum());
    }

    &lt;span class='kw'&gt;explicit operator unsigned&lt;/span&gt;() &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; (&lt;span class='kw'&gt;unsigned&lt;/span&gt;)(m_num/m_denum.denum());
    }

    &lt;span class='kw'&gt;explicit operator&lt;/span&gt; std::int64_t() &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; (m_num/m_denum.denum());
    }

    &lt;span class='kw'&gt;explicit operator&lt;/span&gt; std::uint64_t() &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; (std::uint64_t)(m_num/m_denum.denum());
    }

    &lt;span class='kw'&gt;explicit operator float&lt;/span&gt;() &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; (&lt;span class='kw'&gt;float&lt;/span&gt;)((&lt;span class='kw'&gt;double&lt;/span&gt;)m_num/(&lt;span class='kw'&gt;double&lt;/span&gt;)m_denum.denum());
    }

    &lt;span class='kw'&gt;explicit operator double&lt;/span&gt;() &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; ((&lt;span class='kw'&gt;double&lt;/span&gt;)m_num/(&lt;span class='kw'&gt;double&lt;/span&gt;)m_denum.denum());
    }


    Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; + ( Decimal d2 ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        Decimal d1 = *&lt;span class='kw'&gt;this&lt;/span&gt;;
        adjustPrecisions( d1, d2 );
        d1.m_num += d2.m_num;
        &lt;span class='kw'&gt;return&lt;/span&gt; d1;
    }

    Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; - ( Decimal d2 ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        Decimal d1 = *&lt;span class='kw'&gt;this&lt;/span&gt;;
        adjustPrecisions( d1, d2 );
        d1.m_num -= d2.m_num;
        &lt;span class='kw'&gt;return&lt;/span&gt; d1;
    }

    Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; * ( Decimal d2 ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        num_t num = m_num * d2.m_num;

        &lt;span class='kw'&gt;if&lt;/span&gt; (m_denum &amp;lt; d2.m_denum)
        {
            num /= m_denum.denum();
            &lt;span class='kw'&gt;return&lt;/span&gt; Decimal( num, d2.m_denum );
        }
        &lt;span class='kw'&gt;else&lt;/span&gt;
        {
            num /= d2.m_denum.denum();
            &lt;span class='kw'&gt;return&lt;/span&gt; Decimal( num, m_denum );
        }
    }

    &lt;span class='com'&gt;// 1200.00000 / 22.000 = 54.5454545454545
    // 1200 00000 / 22 000 = 5454.54545454&lt;/span&gt;
    Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; / ( Decimal d2 ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        d2.minimizePrecision();

        Decimal d1 = *&lt;span class='kw'&gt;this&lt;/span&gt;;
        d1.expandTo( m_denum.prec() + d2.m_denum.prec() );
        &lt;span class='kw'&gt;return&lt;/span&gt; Decimal( d1.m_num / d2.m_num, m_denum);
    }

    &lt;span class='com'&gt;// 1200.00000   % 22.000    = 12.000
    // 1200         % 22        = 12
    // 1200 00000   % 22 000    = 12000
    // 1200 000000  % 22 000    = 10000
    // 1200.00000   % 22.00000  = 12.00000
    // 120000000    % 2200000   = 12 00000&lt;/span&gt;

    Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; % ( Decimal d2 ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        Decimal d1 = *&lt;span class='kw'&gt;this&lt;/span&gt;;
        adjustPrecisions( d1, d2 );
        d1.m_num %= d2.m_num;
        &lt;span class='kw'&gt;return&lt;/span&gt; d1;
    }


    Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; += ( Decimal d2 )
    {
        *&lt;span class='kw'&gt;this&lt;/span&gt; = &lt;span class='kw'&gt;operator&lt;/span&gt;+(d2);
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }

    Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; -= ( Decimal d2 )
    {
        *&lt;span class='kw'&gt;this&lt;/span&gt; = &lt;span class='kw'&gt;operator&lt;/span&gt;-(d2);
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }

    Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; *= ( Decimal d2 )
    {
        *&lt;span class='kw'&gt;this&lt;/span&gt; = &lt;span class='kw'&gt;operator&lt;/span&gt;*(d2);
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }

    Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; /= ( Decimal d2 )
    {
        *&lt;span class='kw'&gt;this&lt;/span&gt; = &lt;span class='kw'&gt;operator&lt;/span&gt;/(d2);
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }

    Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; %= ( Decimal d2 )
    {
        *&lt;span class='kw'&gt;this&lt;/span&gt; = &lt;span class='kw'&gt;operator&lt;/span&gt;%(d2);
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }

    &lt;span class='com'&gt;// Decimal operator +   ( int i ) const { return operator+ ( Decimal((int)i, DecimalPrecision(0)) ); }
    // Decimal&amp;amp; operator += ( int i )       { return operator+=( Decimal((int)i, DecimalPrecision(0)) ); }&lt;/span&gt;


    &lt;span class='kw'&gt;#define&lt;/span&gt; MARTY_DECIMAL_IMPLEMENT_ARIPHMETICT_OVERLOADS_FOR_INTEGRAL_TYPE( integralType )         \
                                                                                                    \
                Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; +   ( integralType i ) &lt;span class='kw'&gt;const&lt;/span&gt; { &lt;span class='kw'&gt;return operator&lt;/span&gt;+ ( Decimal(i) ); }  \
                Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; -   ( integralType i ) &lt;span class='kw'&gt;const&lt;/span&gt; { &lt;span class='kw'&gt;return operator&lt;/span&gt;- ( Decimal(i) ); }  \
                Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; *   ( integralType i ) &lt;span class='kw'&gt;const&lt;/span&gt; { &lt;span class='kw'&gt;return operator&lt;/span&gt;* ( Decimal(i) ); }  \
                Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; /   ( integralType i ) &lt;span class='kw'&gt;const&lt;/span&gt; { &lt;span class='kw'&gt;return operator&lt;/span&gt;/ ( Decimal(i) ); }  \
                Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; %   ( integralType i ) &lt;span class='kw'&gt;const&lt;/span&gt; { &lt;span class='kw'&gt;return operator&lt;/span&gt;% ( Decimal(i) ); }  \
                                                                                                    \
                Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; += ( integralType i )       { &lt;span class='kw'&gt;return operator&lt;/span&gt;+=( Decimal(i) ); }  \
                Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; -= ( integralType i )       { &lt;span class='kw'&gt;return operator&lt;/span&gt;-=( Decimal(i) ); }  \
                Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; *= ( integralType i )       { &lt;span class='kw'&gt;return operator&lt;/span&gt;*=( Decimal(i) ); }  \
                Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; /= ( integralType i )       { &lt;span class='kw'&gt;return operator&lt;/span&gt;/=( Decimal(i) ); }  \
                Decimal&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt; %= ( integralType i )       { &lt;span class='kw'&gt;return operator&lt;/span&gt;%=( Decimal(i) ); }


    MARTY_DECIMAL_IMPLEMENT_ARIPHMETICT_OVERLOADS_FOR_INTEGRAL_TYPE( &lt;span class='kw'&gt;int&lt;/span&gt;           )
    MARTY_DECIMAL_IMPLEMENT_ARIPHMETICT_OVERLOADS_FOR_INTEGRAL_TYPE( &lt;span class='kw'&gt;unsigned&lt;/span&gt;      )
    MARTY_DECIMAL_IMPLEMENT_ARIPHMETICT_OVERLOADS_FOR_INTEGRAL_TYPE( std::int64_t  )
    MARTY_DECIMAL_IMPLEMENT_ARIPHMETICT_OVERLOADS_FOR_INTEGRAL_TYPE( std::uint64_t )
    MARTY_DECIMAL_IMPLEMENT_ARIPHMETICT_OVERLOADS_FOR_INTEGRAL_TYPE( &lt;span class='kw'&gt;float&lt;/span&gt;         )
    MARTY_DECIMAL_IMPLEMENT_ARIPHMETICT_OVERLOADS_FOR_INTEGRAL_TYPE( &lt;span class='kw'&gt;double&lt;/span&gt;        )



    &lt;span class='kw'&gt;int&lt;/span&gt; compare( Decimal d2 ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; (m_denum.prec()==d2.m_denum.prec())
        {
            &lt;span class='kw'&gt;return&lt;/span&gt; compare(d2.m_num);
        }

        Decimal d1 = *&lt;span class='kw'&gt;this&lt;/span&gt;;
        adjustPrecisions( d1, d2 );
        &lt;span class='kw'&gt;return&lt;/span&gt; d1.compare(d2);
    }

    MARTY_DECIMAL_IMPLEMENT_RELATIONAL_OPERATORS(Decimal)


    &lt;span class='kw'&gt;static&lt;/span&gt;
    Decimal fromRawNumPrec( num_t num, precision_t prec )
    {
        Decimal res;

        res.m_num   = num;
        res.m_denum = DecimalPrecision(prec);

        &lt;span class='kw'&gt;return&lt;/span&gt; res;
    }


&lt;span class='kw'&gt;protected&lt;/span&gt;:


    Decimal( num_t n, DenumeratorType denum) : m_num(n), m_denum(denum)   {}

    &lt;span class='kw'&gt;static
    void&lt;/span&gt; adjustPrecisions( Decimal &amp;amp;d1, Decimal &amp;amp;d2 )
    {
        &lt;span class='kw'&gt;int&lt;/span&gt; cmp = d1.m_denum.compare( d2.m_denum );
        &lt;span class='kw'&gt;if&lt;/span&gt; (cmp==0) &lt;span class='kw'&gt;return&lt;/span&gt;;

        &lt;span class='kw'&gt;if&lt;/span&gt; (cmp&amp;lt;0)
           d1.expandTo(d2.m_denum.prec());
        &lt;span class='kw'&gt;else&lt;/span&gt;
           d2.expandTo(d1.m_denum.prec());
    }

    std::string rtrimZeros( std::string s )
    {
        &lt;span class='kw'&gt;while&lt;/span&gt;( !s.empty() &amp;amp;&amp;amp; s.back()==&lt;span class='str'&gt;'0'&lt;/span&gt; ) s.erase(s.size()-1, 1);
        &lt;span class='kw'&gt;if&lt;/span&gt; ( !s.empty() &amp;amp;&amp;amp; (s.back()==&lt;span class='str'&gt;'.'&lt;/span&gt; || s.back()==&lt;span class='str'&gt;','&lt;/span&gt;) )
            s.append(1,&lt;span class='str'&gt;'0'&lt;/span&gt;);
        &lt;span class='kw'&gt;return&lt;/span&gt; s;
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; FloatType&amp;gt;
    &lt;span class='kw'&gt;void&lt;/span&gt; fromFloat( FloatType f, precision_t p )
    {
        &lt;span class='kw'&gt;bool&lt;/span&gt; precAuto = (p==0);
        *&lt;span class='kw'&gt;this&lt;/span&gt; = fromString(rtrimZeros(std::to_string(f)));
        &lt;span class='kw'&gt;if&lt;/span&gt; (!precAuto)
            fitTo(p);
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; FloatType&amp;gt;
    &lt;span class='kw'&gt;void&lt;/span&gt; fromFloat( FloatType f, DecimalPrecision p )
    {
        fromFloat( f, p.prec() );
    }

    &lt;span class='kw'&gt;int&lt;/span&gt; compare( num_t n ) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; (m_num&amp;lt;n) &lt;span class='kw'&gt;return&lt;/span&gt; -1;
        &lt;span class='kw'&gt;if&lt;/span&gt; (m_num&amp;gt;n) &lt;span class='kw'&gt;return&lt;/span&gt;  1;
        &lt;span class='kw'&gt;return&lt;/span&gt; 0;
    }

    &lt;span class='kw'&gt;void&lt;/span&gt; expandTo( precision_t p )
    {
        denum_t adjust = m_denum.expandTo(p);
        m_num *= adjust;
    }

    &lt;span class='kw'&gt;void&lt;/span&gt; shrinkTo( precision_t p )
    {
        denum_t adjust = m_denum.shrinkTo(p);
        m_num /= adjust;
    }

    &lt;span class='kw'&gt;void&lt;/span&gt; fitTo( precision_t p )
    {
        sdenum_t adjust = m_denum.fitTo(p);
        &lt;span class='kw'&gt;if&lt;/span&gt; (adjust&amp;lt;0)
           m_num /= (denum_t)-adjust;
        &lt;span class='kw'&gt;else&lt;/span&gt;
           m_num *= (denum_t)adjust;
    }

    &lt;span class='kw'&gt;void&lt;/span&gt; minimizePrecision()
    {
        &lt;span class='kw'&gt;while&lt;/span&gt;( ((m_num%10)==0) &amp;amp;&amp;amp; (m_denum.prec()&amp;gt;0) )
        {
            m_num /= 10;
            m_denum.decPrec();
        }
    }


    
    &lt;span class='com'&gt;//precision_t

    //DecimalPrecision decimalPrecision( )&lt;/span&gt;

    num_t               m_num;
    DenumeratorType     m_denum;

}; &lt;span class='com'&gt;// class Decimal

//----------------------------------------------------------------------------





//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;#define&lt;/span&gt; MARTY_DECIMAL_IMPLEMENT_FRIEND_OVERLOADS_FOR_INTEGRAL_TYPE( integralType )                                          \
                                                                                                                            \
    &lt;span class='kw'&gt;inline bool operator&lt;/span&gt;&amp;lt; ( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i) &amp;lt;  d; }                                  \
    &lt;span class='kw'&gt;inline bool operator&lt;/span&gt;&amp;lt;=( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i) &amp;lt;= d; }                                  \
    &lt;span class='kw'&gt;inline bool operator&lt;/span&gt;&amp;gt; ( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i) &amp;gt;  d; }                                  \
    &lt;span class='kw'&gt;inline bool operator&lt;/span&gt;&amp;gt;=( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i) &amp;gt;= d; }                                  \
    &lt;span class='kw'&gt;inline bool operator&lt;/span&gt;==( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i) == d; }                                  \
    &lt;span class='kw'&gt;inline bool operator&lt;/span&gt;!=( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i) != d; }                                  \
                                                                                                                            \
    &lt;span class='kw'&gt;inline&lt;/span&gt; Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; + ( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i).&lt;span class='kw'&gt;operator&lt;/span&gt;+ ( d ); }                   \
    &lt;span class='kw'&gt;inline&lt;/span&gt; Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; - ( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i).&lt;span class='kw'&gt;operator&lt;/span&gt;- ( d ); }                   \
    &lt;span class='kw'&gt;inline&lt;/span&gt; Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; * ( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i).&lt;span class='kw'&gt;operator&lt;/span&gt;* ( d ); }                   \
    &lt;span class='kw'&gt;inline&lt;/span&gt; Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; / ( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i).&lt;span class='kw'&gt;operator&lt;/span&gt;/ ( d ); }                   \
    &lt;span class='kw'&gt;inline&lt;/span&gt; Decimal &lt;span class='kw'&gt;operator&lt;/span&gt; % ( integralType i, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d ) { &lt;span class='kw'&gt;return&lt;/span&gt; Decimal(i).&lt;span class='kw'&gt;operator&lt;/span&gt;% ( d ); }

&lt;span class='com'&gt;//----------------------------------------------------------------------------




//----------------------------------------------------------------------------&lt;/span&gt;
MARTY_DECIMAL_IMPLEMENT_FRIEND_OVERLOADS_FOR_INTEGRAL_TYPE( &lt;span class='kw'&gt;int&lt;/span&gt;           )
MARTY_DECIMAL_IMPLEMENT_FRIEND_OVERLOADS_FOR_INTEGRAL_TYPE( &lt;span class='kw'&gt;unsigned&lt;/span&gt;      )
MARTY_DECIMAL_IMPLEMENT_FRIEND_OVERLOADS_FOR_INTEGRAL_TYPE( std::int64_t  )
MARTY_DECIMAL_IMPLEMENT_FRIEND_OVERLOADS_FOR_INTEGRAL_TYPE( std::uint64_t )
MARTY_DECIMAL_IMPLEMENT_FRIEND_OVERLOADS_FOR_INTEGRAL_TYPE( &lt;span class='kw'&gt;float&lt;/span&gt;         )
MARTY_DECIMAL_IMPLEMENT_FRIEND_OVERLOADS_FOR_INTEGRAL_TYPE( &lt;span class='kw'&gt;double&lt;/span&gt;        )

&lt;span class='com'&gt;//----------------------------------------------------------------------------




//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;inline
void&lt;/span&gt; swap( Decimal &amp;amp;d1, Decimal &amp;amp;d2 )
{
    d1.swap(d2);
}

&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;inline&lt;/span&gt;
std::string toString  ( &lt;span class='kw'&gt;const&lt;/span&gt; Decimal     &amp;amp;d )
{
    Decimal::num_t p1 = d.m_num / d.m_denum.denum();
    Decimal::num_t p2 = d.m_num % d.m_denum.denum();

    std::string res = std::to_string(p1);

    std::size_t prec = d.m_denum.prec();

    &lt;span class='kw'&gt;if&lt;/span&gt; (!prec)
        &lt;span class='kw'&gt;return&lt;/span&gt; res; &lt;span class='com'&gt;// No decimal digits after dot&lt;/span&gt;

    &lt;span class='kw'&gt;if&lt;/span&gt; (p2&amp;lt;0)
        p2 = -p2;

    std::string strP2 = std::to_string(p2);

    std::size_t leadingZerosNum = 0;
    &lt;span class='kw'&gt;if&lt;/span&gt; (prec&amp;gt;strP2.size())
        leadingZerosNum = prec - strP2.size();

    &lt;span class='kw'&gt;return&lt;/span&gt; res + std::string(1, &lt;span class='str'&gt;'.'&lt;/span&gt;) + std::string(leadingZerosNum, &lt;span class='str'&gt;'0'&lt;/span&gt;) + strP2;
}

&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; CharType&amp;gt;
&lt;span class='kw'&gt;inline
int&lt;/span&gt; charToDecimalDigit( CharType ch )
{
    &lt;span class='kw'&gt;if&lt;/span&gt; (ch&amp;lt;(CharType)&lt;span class='str'&gt;'0'&lt;/span&gt;) &lt;span class='kw'&gt;return&lt;/span&gt; -1;
    &lt;span class='kw'&gt;if&lt;/span&gt; (ch&amp;gt;(CharType)&lt;span class='str'&gt;'9'&lt;/span&gt;) &lt;span class='kw'&gt;return&lt;/span&gt; -1;
    &lt;span class='kw'&gt;return&lt;/span&gt; (&lt;span class='kw'&gt;int&lt;/span&gt;)(ch - (CharType)&lt;span class='str'&gt;'0'&lt;/span&gt;);
}

&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; CharType&amp;gt;
&lt;span class='kw'&gt;inline
bool&lt;/span&gt; charIsDecimalSeparator( CharType ch )
{
    &lt;span class='kw'&gt;if&lt;/span&gt; (ch==(CharType)&lt;span class='str'&gt;'.'&lt;/span&gt;) &lt;span class='kw'&gt;return true&lt;/span&gt;;
    &lt;span class='kw'&gt;if&lt;/span&gt; (ch==(CharType)&lt;span class='str'&gt;','&lt;/span&gt;) &lt;span class='kw'&gt;return true&lt;/span&gt;;
    &lt;span class='kw'&gt;return false&lt;/span&gt;;
}

&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt;&lt;span class='kw'&gt;typename&lt;/span&gt; CharType&amp;gt;
&lt;span class='kw'&gt;inline
int&lt;/span&gt; charIsSpaceOrTab( CharType ch )
{
    &lt;span class='kw'&gt;switch&lt;/span&gt;((&lt;span class='kw'&gt;char&lt;/span&gt;)ch)
    {
        &lt;span class='kw'&gt;case&lt;/span&gt; &lt;span class='str'&gt;' '&lt;/span&gt; : &lt;span class='kw'&gt;return true&lt;/span&gt;;
        &lt;span class='kw'&gt;case&lt;/span&gt; &lt;span class='str'&gt;'\t'&lt;/span&gt;: &lt;span class='kw'&gt;return true&lt;/span&gt;;
        &lt;span class='kw'&gt;default&lt;/span&gt;  : &lt;span class='kw'&gt;return false&lt;/span&gt;;
    };
}

&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;inline&lt;/span&gt;
Decimal     fromString( &lt;span class='kw'&gt;const&lt;/span&gt; std::string &amp;amp;numberStr)
{
    std::string::size_type pos = 0;
    std::string::size_type sz  = numberStr.size();

    &lt;span class='kw'&gt;bool&lt;/span&gt; neg = &lt;span class='kw'&gt;false&lt;/span&gt;;

    &lt;span class='kw'&gt;while&lt;/span&gt;( charIsSpaceOrTab(numberStr[pos]) &amp;amp;&amp;amp; pos!=sz ) pos++;
    &lt;span class='kw'&gt;if&lt;/span&gt; (pos==sz) &lt;span class='kw'&gt;throw&lt;/span&gt; std::runtime_error(&lt;span class='str'&gt;"Decimal fromString - empty string taken as number string"&lt;/span&gt;);

    &lt;span class='kw'&gt;if&lt;/span&gt; (numberStr[pos]==&lt;span class='str'&gt;'+'&lt;/span&gt;)                        { pos++; }
    &lt;span class='kw'&gt;else if&lt;/span&gt; (numberStr[pos]==&lt;span class='str'&gt;'-'&lt;/span&gt;)                   { pos++; neg = &lt;span class='kw'&gt;true&lt;/span&gt;; }
    &lt;span class='kw'&gt;else if&lt;/span&gt; (charToDecimalDigit(numberStr[pos])&amp;gt;=0) {}
    &lt;span class='kw'&gt;else throw&lt;/span&gt; std::runtime_error(&lt;span class='str'&gt;"Decimal fromString - invalid character found"&lt;/span&gt;);

    &lt;span class='kw'&gt;while&lt;/span&gt;( charIsSpaceOrTab(numberStr[pos]) ) pos++;

    std::int64_t  num = 0;
    std::uint32_t precision = 0;

    &lt;span class='kw'&gt;int&lt;/span&gt; dig = charToDecimalDigit(numberStr[pos]);
    &lt;span class='kw'&gt;while&lt;/span&gt;(dig&amp;gt;=0)
    {
        num *= 10;
        num += (std::int64_t)dig;
        pos++;
        dig = charToDecimalDigit(numberStr[pos]);
    }

    &lt;span class='kw'&gt;if&lt;/span&gt; (neg)
        num = -num;

    &lt;span class='kw'&gt;if&lt;/span&gt; (!charIsDecimalSeparator(numberStr[pos]))
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; Decimal( num, DecimalPrecision(0) );
    }

    pos++;

    &lt;span class='kw'&gt;unsigned&lt;/span&gt; prec = 0;

    dig = charToDecimalDigit(numberStr[pos]);
    &lt;span class='kw'&gt;while&lt;/span&gt;( sz != pos &amp;amp;&amp;amp; (dig&amp;gt;=0  &lt;span class='com'&gt;/* &amp;amp;&amp;amp; (d[pos]!=' ' &amp;amp;&amp;amp; d[pos]!='\'') */&lt;/span&gt; ) )
    {
        num *= 10;
        num += (std::int64_t)dig;
        pos++;
        dig = charToDecimalDigit(numberStr[pos]);
        prec++;
    }

    &lt;span class='kw'&gt;return&lt;/span&gt; Decimal::fromRawNumPrec( num, prec );

}

&lt;span class='com'&gt;//----------------------------------------------------------------------------&lt;/span&gt;
&lt;span class='kw'&gt;inline&lt;/span&gt;
std::ostream&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;&amp;lt;&amp;lt;( std::ostream &amp;amp;s, &lt;span class='kw'&gt;const&lt;/span&gt; Decimal &amp;amp;d )
{
    s&amp;lt;&amp;lt;toString(d);
    &lt;span class='kw'&gt;return&lt;/span&gt; s;
}

&lt;span class='com'&gt;//----------------------------------------------------------------------------




//----------------------------------------------------------------------------&lt;/span&gt;

} &lt;span class='com'&gt;// namespace marty&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;iostream&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"marty_decimal.h"&lt;/span&gt;

&lt;span class='kw'&gt;int&lt;/span&gt; main()
{
    &lt;span class='kw'&gt;using&lt;/span&gt; std::cout;
    &lt;span class='kw'&gt;using&lt;/span&gt; std::endl;

    &lt;span class='kw'&gt;using&lt;/span&gt; std::cout;
    &lt;span class='kw'&gt;using&lt;/span&gt; std::endl;

    &lt;span class='kw'&gt;using&lt;/span&gt; marty::Decimal;
    &lt;span class='kw'&gt;using&lt;/span&gt; marty::DecimalPrecision;
    &lt;span class='kw'&gt;using&lt;/span&gt; marty::toString;
    &lt;span class='kw'&gt;using&lt;/span&gt; marty::fromString;

    &lt;span class='kw'&gt;#define&lt;/span&gt; PRINT( var ) cout &amp;lt;&amp;lt; #var &amp;lt;&amp;lt; &lt;span class='str'&gt;": "&lt;/span&gt;&amp;lt;&amp;lt; var &amp;lt;&amp;lt; endl;

    Decimal d1_u64_3   = (std::uint64_t)(3)  ; PRINT(d1_u64_3);
    Decimal d1_i64_7   = (std::int64_t )(7)  ; PRINT(d1_i64_7);
    Decimal d1_i64_m10 = (std::int64_t )(-10); PRINT(d1_i64_m10);
    Decimal d1_i64_15_000 = Decimal(15, DecimalPrecision(3)); PRINT(d1_i64_15_000);
    Decimal d1 = fromString(&lt;span class='str'&gt;"123.010"&lt;/span&gt;);        PRINT(d1);
    Decimal d2 = fromString(&lt;span class='str'&gt;"13.10"&lt;/span&gt;);          PRINT(d2);
    Decimal d1_2_sum = d1 + d2;                PRINT(d1_2_sum);  &lt;span class='com'&gt;// 123.010 + 13.10 =  136.11&lt;/span&gt;
    Decimal d1_2_raz = d1 - d2;                PRINT(d1_2_raz);  &lt;span class='com'&gt;// 123.010 - 13.10 =  109.91&lt;/span&gt;
    Decimal d1_2_mul = d1 * d2;                PRINT(d1_2_mul);  &lt;span class='com'&gt;// 123.010 * 13.10 = 1611.431&lt;/span&gt;
    Decimal d1_2_div = d1 / d2;                PRINT(d1_2_div);  &lt;span class='com'&gt;// 123.010 / 13.10 =    9.390076335877862595419847328&lt;/span&gt;
    Decimal d1_2_ost = d1 % d2;                PRINT(d1_2_ost);  &lt;span class='com'&gt;// 123.010 % 13.10 =    5.11&lt;/span&gt;

    &lt;span class='kw'&gt;auto&lt;/span&gt;    d1_2_sum_plus_15_a = d1_2_sum + (std::int64_t )(15); PRINT(d1_2_sum_plus_15_a);
    &lt;span class='kw'&gt;auto&lt;/span&gt;    d1_2_sum_plus_15_b = d1_2_sum + (std::uint64_t)(15); PRINT(d1_2_sum_plus_15_b);
    &lt;span class='kw'&gt;auto&lt;/span&gt;    d1_2_sum_plus_15_c = d1_2_sum + (&lt;span class='kw'&gt;int&lt;/span&gt;          )(15); PRINT(d1_2_sum_plus_15_c);
    &lt;span class='kw'&gt;auto&lt;/span&gt;    d1_2_sum_plus_15_d = d1_2_sum + (&lt;span class='kw'&gt;unsigned&lt;/span&gt;     )(15); PRINT(d1_2_sum_plus_15_d);
    &lt;span class='kw'&gt;auto&lt;/span&gt;    d1_2_sum_plus_15_e = d1_2_sum + (&lt;span class='kw'&gt;double&lt;/span&gt;       )(15); PRINT(d1_2_sum_plus_15_e);
    
    &lt;span class='kw'&gt;return&lt;/span&gt; 0;

}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Sun, 27 Dec 2020 14:58:18 GMT</pubDate>
		
			<author>Marty &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>6</slash:comments>
		
	</item>

	<item>
		<title>Сборка/отладка/логгировани firefox из исходников под Ubuntu</title>
		<link>http://rsdn.org/Forum/src/7438303.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/7438303</guid>
		<comments>http://rsdn.org/Forum/src/7438303</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=7438303</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/7438303</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=7438303</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Надеюсь описанное ниже никогда вам не понадобится &lt;img border='0' width='15' height='15' src='//rsdn.org/Forum/images/wink.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
1)Копируем source пакет firefox-а в текущую папку&lt;br /&gt;
&lt;br /&gt;
sudo apt-get build-dep firefox&lt;br /&gt;
sudo apt-get install -y fakeroot&lt;br /&gt;
apt-get source firefox&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2)можно попробовать пофиксать параметры mach-а в файле debian/config/mozconfig.in перед тем как запустить build. например можно сделать дебажный билд как описано тут &lt;a class="m" href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_build/Linux_and_MacOS_build_preparation" target="_blank"&gt;https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_build/Linux_and_MacOS_build_preparation&lt;/a&gt;&lt;br /&gt;
Так же можно если надо ограничить число ядер задействованных в билде. В моем случае если на задать этот параметр на ноуте невозможно работать пока идет билд. Я бы поставил его в число доступных ядер &amp;mdash; 20-30%, например так&lt;br /&gt;
&lt;br /&gt;
mk_add_options MOZ_MAKE_FLAGS="-j4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
как описано тут &lt;a class="m" href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Configuring_Build_Options" target="_blank"&gt;здесь&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
3)Билдаем&lt;br /&gt;
&lt;br /&gt;
dpkg-buildpackage -b -us -uc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
это займет кучу времени. У меня такой билд прошел нормально, а билд по инструкции firefox-а на том же релизе сфейлился. Видимо что-то maintainer-ы пакета пофиксали в патчах для пакета(а их было штук 5. не разбирался, когда построилось просто был рад), потому что билдил все на той же тачке. Да и вообще билдить это все лучше в контейнере, чтобы если что-то пошло не так снести его и не угробить рабочую машину. Я использовал LXD и новый контейнер 18.04 в нем.&lt;br /&gt;
&lt;br /&gt;
Эта часть инструкции заимствована преимущественно отсюда&lt;br /&gt;
&lt;a class="m" href="https://askubuntu.com/questions/947784/building-firefox-from-source" target="_blank"&gt;здесь&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После успешной постройки артифакты билда лежат в папке obj-x86_64-linux-gnu&lt;br /&gt;
Бинарники firefox-а в папке obj-x86_64-linux-gnu/dist/bin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если перестраивать код после фиксов, в например папке media, перестраивается только библиотека libxul.so. Линкуется она кучу времени.&lt;br /&gt;
&lt;br /&gt;
Чтобы построить только те файлы, которые поменял, например в libpng и не ждать линковки каждый раз идем в фолдер&lt;br /&gt;
obj-x86_64-linux-gnu/media/libpng, чтобы make не ходил по неизмененным папкам, чтобы проверить что они не менялись&lt;br /&gt;
и делаем&lt;br /&gt;
&lt;b&gt;make&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
после того как фиксы скомпилировались и мы хотим пересобрать libxul.so идем в корневой фолдер и делаем&lt;br /&gt;
&lt;b&gt;make&lt;/b&gt;&lt;br /&gt;
джем кучу времени пока она слинкуется&lt;br /&gt;
&lt;br /&gt;
запускается все это добро как обычно&lt;br /&gt;
&lt;b&gt;./mach run&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Статья про отладку &lt;b&gt;&lt;a class="m" href="https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Debugging_Mozilla_with_gdb" target="_blank"&gt;https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Debugging_Mozilla_with_gdb&lt;/a&gt;&lt;/b&gt; надеюсь вам это не понадобится&lt;br /&gt;
Надеюсь что хватит логгирования &lt;a class="m" href="https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Gecko_Logging" target="_blank"&gt;здесь&lt;/a&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Thu, 09 May 2019 08:11:49 GMT</pubDate>
		
			<author>Jakop &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Mortal Kombat 3</title>
		<link>http://rsdn.org/Forum/src/7282578.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/7282578</guid>
		<comments>http://rsdn.org/Forum/src/7282578</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=7282578</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/7282578</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=7282578</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;&lt;a class="m" href="https://archive.org/download/MortalKombat3SourceCodeDump" target="_blank"&gt;https://archive.org/download/MortalKombat3SourceCodeDump&lt;/a&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Thu, 25 Oct 2018 20:34:51 GMT</pubDate>
		
			<author>Muxa &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Mecrurial: Ограниченная версия репозитория для нового удалённого сотрудника.</title>
		<link>http://rsdn.org/Forum/src/7137156.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/7137156</guid>
		<comments>http://rsdn.org/Forum/src/7137156</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=7137156</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/7137156</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=7137156</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Здравствуйте,&lt;br /&gt;
&lt;br /&gt;
Есть Mercurial репозиторий с программным решением, который используется внутри компании ограниченным кругом разработчиков.&lt;br /&gt;
В данном репозитории есть конфигурационные файлы с подключением к БД.&lt;br /&gt;
В данный момент планируем привлеч к разработке удалённого сотрудника. Но есть необходимость ограничить его доступ к основной БД.&lt;br /&gt;
Решили запустить новый инстанс с БД, куда будут реплицироваться данные с основной БД.&lt;br /&gt;
К данной БД дать доступ удалённому разработчику для его экспериментов. &lt;br /&gt;
&lt;br /&gt;
Хотим скрыть данные о подключении к основной БД, но они есть в истории.&lt;br /&gt;
Ищу решение этой проблемы. Как вариант теоретически это может быть ещё одна версия репозитория, с которой можно будет каким-то образом мержить основную версию.&lt;br /&gt;
&lt;br /&gt;
Прошу посоветовать решение для этой проблемы.&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Mon, 07 May 2018 08:27:08 GMT</pubDate>
		
			<author>WSA &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>6</slash:comments>
		
	</item>

	<item>
		<title>Suspender</title>
		<link>http://rsdn.org/Forum/src/6301728.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/6301728</guid>
		<comments>http://rsdn.org/Forum/src/6301728</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=6301728</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/6301728</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=6301728</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Коллеги, привет! &lt;img border='0' width='15' height='15' src='//rsdn.org/Forum/images/smile.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a class="github m" href="https://github.com/devromik/suspender" target="_blank"&gt;https://github.com/devromik/suspender&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Небольшая библиотека на Java, позволяющая:&lt;br /&gt;
&lt;ul style='margin-top:0; margin-bottom:0;'&gt;&lt;li /&gt;откладывать произвольные объекты на определённое время, используя путь (строка вида /segment_1/segment_2/…/segment_N) в качестве ключа &lt;br /&gt;
&lt;li /&gt;получать оповещения о восстановлении объектов&lt;br /&gt;
&lt;li /&gt;восстанавливать объекты, отложенные по префиксу, &lt;b&gt;до&lt;/b&gt; истечения времени откладывания. Префикс &amp;mdash; путь, состоящий из нескольких первых сегментов другого пути,  расположенных в том же порядке. Объекты, отложенные по префиксу, &amp;mdash; объекты, отложенные по путям с данным префиксом&lt;br /&gt;
&lt;li /&gt;восстанавливать отложенный по префиксу объект с ближайшим временем восстановления&lt;br /&gt;
&lt;li /&gt;проверять, имеются ли объекты, отложенные по префиксу  &lt;br /&gt;
&lt;li /&gt;восстанавливать все объекты, отложенные по префиксу &lt;br /&gt;
&lt;li /&gt;concurrent: после того, как Suspender создан и запущен, можно работать с ним из нескольких потоков без ограничений. Реализация с этой точки зрения fine-grained  &amp;mdash; на практике блокировки удерживаются только на время поиска узла дерева отложенных объектов, соответствующего данному пути&lt;br /&gt;
&lt;li /&gt;покрыта тестами на 95%&lt;/ul&gt;
    &lt;br /&gt;
Использовали в паре проектов на работе. &lt;br /&gt;
&lt;br /&gt;
Имеется зависимость от библиотеки slf4j-utils, которой в центральном Maven-репозитории нет. Найти её можно здесь: &lt;a class="github m" href="https://github.com/devromik/slf4j-utils" target="_blank"&gt;https://github.com/devromik/slf4j-utils&lt;/a&gt; &lt;br /&gt;
Библиотека малюсенькая, при желании можно выпилить, заменив на что-то своё.&lt;br /&gt;
&lt;br /&gt;
pom.xml имеет несколько профилей, которые я обыкновенно использую в своих проектах. &lt;br /&gt;
Поэтому, прежде чем собирать, желательно заглянуть в этот файлик.&lt;br /&gt;
&lt;br /&gt;
Более подробное описание библиотеки можно найти в заголовочном комментарии к интерфейсу Suspender.&lt;br /&gt;
&lt;br /&gt;
P. S.: приветствуются вопросы, pull-request-ы, замечания, предложения&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Tue, 05 Jan 2016 22:07:06 GMT</pubDate>
		
			<author>devromik &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>8</slash:comments>
		
	</item>

	<item>
		<title>[C# 4 и 3] Построитель компараторов [Bug fixed]</title>
		<link>http://rsdn.org/Forum/src/5990092.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/5990092</guid>
		<comments>http://rsdn.org/Forum/src/5990092</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=5990092</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/5990092</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=5990092</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;По мотивам &lt;a class="m tips" href="http://rsdn.org/forum/src/3914421" target="_blank"&gt;[C# 4 и 3] Построитель компараторов&lt;/a&gt; (Я так понимаю, на страрую тему запретили отвечать? Создам на всякий случай новую)&lt;br /&gt;
&lt;br /&gt;
В компараторе внезапно обнаружилась древняя бага, проявляющаяся в создаваемом Comparer&amp;lt;&amp;gt;-е при сравнении нуллейбл-полей (сравнение проходит не верно). С EqualityComparer&amp;lt;&amp;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(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;&lt;span class='com'&gt;// 1. Вместо старых функций IsNull и IsNotNull делаем новые:&lt;/span&gt;

&lt;span class='kw'&gt;private static&lt;/span&gt; BinaryExpression IsNull(Expression expression) {
  &lt;span class='kw'&gt;if&lt;/span&gt;(expression == &lt;span class='kw'&gt;null&lt;/span&gt;) {
    &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentNullException(&lt;span class='str'&gt;"expression"&lt;/span&gt;);
  }&lt;span class='com'&gt;//if&lt;/span&gt;

  &lt;span class='kw'&gt;if&lt;/span&gt;(IsTypeByReference(expression)) {
    &lt;span class='kw'&gt;return&lt;/span&gt; Expression.ReferenceEqual(expression, Null);
  } &lt;span class='kw'&gt;else&lt;/span&gt; {
    &lt;span class='kw'&gt;return&lt;/span&gt; Expression.Equal(expression, Null);
  }&lt;span class='com'&gt;//if&lt;/span&gt;
}

&lt;span class='kw'&gt;private static&lt;/span&gt; BinaryExpression IsNotNull(Expression expression) {
  &lt;span class='kw'&gt;if&lt;/span&gt;(expression == &lt;span class='kw'&gt;null&lt;/span&gt;) {
    &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentNullException(&lt;span class='str'&gt;"expression"&lt;/span&gt;);
  }&lt;span class='com'&gt;//if&lt;/span&gt;

  &lt;span class='kw'&gt;if&lt;/span&gt;(IsTypeByReference(expression)) {
    &lt;span class='kw'&gt;return&lt;/span&gt; Expression.ReferenceNotEqual(expression, Null);
  } &lt;span class='kw'&gt;else&lt;/span&gt; {
    &lt;span class='kw'&gt;return&lt;/span&gt; Expression.NotEqual(expression, Null);
  }&lt;span class='com'&gt;//if&lt;/span&gt;
}

&lt;span class='kw'&gt;private static bool&lt;/span&gt; IsTypeByReference(Expression expression) {
  &lt;span class='kw'&gt;if&lt;/span&gt;(expression == &lt;span class='kw'&gt;null&lt;/span&gt;) {
    &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentNullException(&lt;span class='str'&gt;"expression"&lt;/span&gt;);
  }&lt;span class='com'&gt;//if&lt;/span&gt;

  &lt;span class='kw'&gt;return&lt;/span&gt; IsTypeByReference(expression.Type);
}

&lt;span class='kw'&gt;private static bool&lt;/span&gt; IsTypeNullable(Expression expression) {
  &lt;span class='kw'&gt;if&lt;/span&gt;(expression == &lt;span class='kw'&gt;null&lt;/span&gt;) {
    &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentNullException(&lt;span class='str'&gt;"expression"&lt;/span&gt;);
  }&lt;span class='com'&gt;//if&lt;/span&gt;

  &lt;span class='kw'&gt;var type&lt;/span&gt; = expression.Type;
  &lt;span class='kw'&gt;return&lt;/span&gt; IsTypeByReference(&lt;span class='kw'&gt;type&lt;/span&gt;) || &lt;span class='kw'&gt;type&lt;/span&gt;.IsValueType &amp;amp;&amp;amp; Nullable.GetUnderlyingType(&lt;span class='kw'&gt;type&lt;/span&gt;) != &lt;span class='kw'&gt;null&lt;/span&gt;;
}

&lt;span class='kw'&gt;private static bool&lt;/span&gt; IsTypeByReference(Type &lt;span class='kw'&gt;type&lt;/span&gt;) {
  &lt;span class='kw'&gt;if&lt;/span&gt;(&lt;span class='kw'&gt;type&lt;/span&gt; == &lt;span class='kw'&gt;null&lt;/span&gt;) {
    &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentNullException(&lt;span class='str'&gt;"type"&lt;/span&gt;);
  }&lt;span class='com'&gt;//if&lt;/span&gt;

  &lt;span class='kw'&gt;return type&lt;/span&gt;.IsClass || &lt;span class='kw'&gt;type&lt;/span&gt;.IsInterface;
}

&lt;span class='com'&gt;// 2. Метод MakeCompare&amp;lt;P&amp;gt; должен быть таким (изменена ветка else)&lt;/span&gt;

&lt;span class='kw'&gt;protected virtual&lt;/span&gt; Expression MakeCompare&amp;lt;P&amp;gt;(Expression left, Expression right, IComparer&amp;lt;P&amp;gt; comparer) {
  &lt;span class='kw'&gt;if&lt;/span&gt;(left == &lt;span class='kw'&gt;null&lt;/span&gt;) {
    &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentNullException(&lt;span class='str'&gt;"left"&lt;/span&gt;);
  } &lt;span class='kw'&gt;else if&lt;/span&gt;(right == &lt;span class='kw'&gt;null&lt;/span&gt;) {
    &lt;span class='kw'&gt;throw new&lt;/span&gt; ArgumentNullException(&lt;span class='str'&gt;"right"&lt;/span&gt;);
  }&lt;span class='com'&gt;//if&lt;/span&gt;

  &lt;span class='kw'&gt;if&lt;/span&gt;(comparer != &lt;span class='kw'&gt;null&lt;/span&gt;) {
    &lt;span class='com'&gt;// return comparer.Compare(left, right);&lt;/span&gt;
    Func&amp;lt;P, P, &lt;span class='kw'&gt;int&lt;/span&gt;&amp;gt; @&lt;span class='kw'&gt;delegate&lt;/span&gt; = comparer.Compare;
    &lt;span class='kw'&gt;var&lt;/span&gt; instance = Expression.Constant(comparer);
    &lt;span class='kw'&gt;return&lt;/span&gt; Expression.Call(instance, @&lt;span class='kw'&gt;delegate&lt;/span&gt;.Method, left, right);
  } &lt;span class='kw'&gt;else&lt;/span&gt; {
    &lt;span class='com'&gt;// (left &amp;lt; right) ? -1 : (right &amp;lt; left ? 1 : 0);&lt;/span&gt;
    &lt;span class='kw'&gt;var&lt;/span&gt; compare = Expression.Condition(Expression.LessThan(left, right), MinusOne, Expression.Condition(Expression.LessThan(right, left), One, Zero));
    &lt;span class='kw'&gt;var&lt;/span&gt; code = (IsTypeNullable(left) ? 2 : 0) + (IsTypeNullable(right) ? 1 : 0);
    &lt;span class='kw'&gt;switch&lt;/span&gt;(code) {
    &lt;span class='kw'&gt;case&lt;/span&gt; 0: &lt;span class='com'&gt;// "left" and "right" both are not nullable&lt;/span&gt;
      &lt;span class='kw'&gt;return&lt;/span&gt; compare;
    &lt;span class='kw'&gt;case&lt;/span&gt; 1: &lt;span class='com'&gt;// "left" is not nullable and "right" is nullable
      // (object)right == null ? 1 : {compare};&lt;/span&gt;
      &lt;span class='kw'&gt;return&lt;/span&gt; Expression.Condition(IsNull(right), One, compare);
    &lt;span class='kw'&gt;case&lt;/span&gt; 2: &lt;span class='com'&gt;// "left" is nullable and "right" is not nullable
      // (object)left == null ? -1 : {compare};&lt;/span&gt;
      &lt;span class='kw'&gt;return&lt;/span&gt; Expression.Condition(IsNull(left), MinusOne, compare);
    &lt;span class='kw'&gt;case&lt;/span&gt; 3: &lt;span class='com'&gt;// "left" and "right" both are nullable
      // (object)left == null ? (right == null ? 0 : -1) : ((object)right == null ? 1 : {compare});&lt;/span&gt;
      &lt;span class='kw'&gt;return&lt;/span&gt; Expression.Condition(IsNull(left), Expression.Condition(IsNull(right), Zero, MinusOne), Expression.Condition(IsNull(right), One, compare));
    &lt;span class='kw'&gt;default&lt;/span&gt;:
      &lt;span class='kw'&gt;const string&lt;/span&gt; Format = &lt;span class='str'&gt;"Invalid code: left.Type = {0}, right.Type = {1}, code = {2}."&lt;/span&gt;;
      &lt;span class='kw'&gt;var&lt;/span&gt; message = String.Format(Format, left.Type, right.Type, code);
      Debug.Fail(message);
      &lt;span class='kw'&gt;throw new&lt;/span&gt; InvalidOperationException(message);
    }&lt;span class='com'&gt;//switch&lt;/span&gt;
  }&lt;span class='com'&gt;//if&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Тест для проверки:&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;class&lt;/span&gt; BaseData
{
  &lt;span class='kw'&gt;public&lt;/span&gt; BaseData(DateTime? test = &lt;span class='kw'&gt;null&lt;/span&gt;) {
    Test = test;
  }

  &lt;span class='kw'&gt;public&lt;/span&gt; DateTime? Test { &lt;span class='kw'&gt;get&lt;/span&gt;; &lt;span class='kw'&gt;private set&lt;/span&gt;; }
}

&lt;span class='kw'&gt;public static void&lt;/span&gt; CompareNullableProperty() {
  &lt;span class='kw'&gt;var&lt;/span&gt; comparer = &lt;span class='kw'&gt;new&lt;/span&gt; ComparerBuilder&amp;lt;BaseData&amp;gt;().Add(&lt;span class='kw'&gt;value&lt;/span&gt; =&amp;gt; &lt;span class='kw'&gt;value&lt;/span&gt;.Test).ToComparer();
  &lt;span class='kw'&gt;var&lt;/span&gt; items = &lt;span class='kw'&gt;new&lt;/span&gt;[] {
    &lt;span class='kw'&gt;new&lt;/span&gt; BaseData(&lt;span class='kw'&gt;null&lt;/span&gt;),
    &lt;span class='kw'&gt;new&lt;/span&gt; BaseData(&lt;span class='kw'&gt;new&lt;/span&gt; DateTime(2015, 01, 01)),
    &lt;span class='kw'&gt;new&lt;/span&gt; BaseData(&lt;span class='kw'&gt;null&lt;/span&gt;),
    &lt;span class='kw'&gt;new&lt;/span&gt; BaseData(&lt;span class='kw'&gt;new&lt;/span&gt; DateTime(2015, 02, 01)),
    &lt;span class='kw'&gt;new&lt;/span&gt; BaseData(&lt;span class='kw'&gt;null&lt;/span&gt;),
    &lt;span class='kw'&gt;new&lt;/span&gt; BaseData(&lt;span class='kw'&gt;new&lt;/span&gt; DateTime(2015, 03, 01)),
  };
  Array.Sort(items, comparer);
  &lt;span class='kw'&gt;var&lt;/span&gt; previous = &lt;span class='kw'&gt;default&lt;/span&gt;(BaseData);
  &lt;span class='kw'&gt;foreach&lt;/span&gt;(&lt;span class='kw'&gt;var&lt;/span&gt; item &lt;span class='kw'&gt;in&lt;/span&gt; items) {
    &lt;span class='kw'&gt;if&lt;/span&gt;(previous != &lt;span class='kw'&gt;null&lt;/span&gt;) {
      Debug.Assert(previous.Test == &lt;span class='kw'&gt;null&lt;/span&gt; || previous.Test &amp;lt;= item.Test,String.Format(&lt;span class='str'&gt;"previous.Test2 == null || previous.Test2 [{0}] &amp;lt;= item.Test2 [{1}]"&lt;/span&gt;, previous.Test, item.Test));
    }&lt;span class='com'&gt;//if&lt;/span&gt;
    previous = item;
  }&lt;span class='com'&gt;//for&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;a class="github m" href="https://github.com/ViIvanov/ComparerBuilder" target="_blank"&gt;гитхабе&lt;/a&gt;, но уже на шестом шарпе, но уже и не такой куцый.&lt;br /&gt;
&lt;br /&gt;
Edit: Исправил код, убрав nameof и переименов вспомагательный метод.&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Sun, 22 Mar 2015 03:40:49 GMT</pubDate>
		
			<author>_temp &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Собственный встраиваемый скриптинг</title>
		<link>http://rsdn.org/Forum/src/5979967.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/5979967</guid>
		<comments>http://rsdn.org/Forum/src/5979967</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=5979967</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/5979967</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=5979967</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;По работе пришлось писать встраиваемый парсер для скриптового языка. Lua и иже с ним не пошёл так как нужно было для разных пользователей разную функциональность, а стандартные функции Lua не так уж просто из него убрать. В общем попробовал написать свой и оказалось, что дело несложное. Идею взял&lt;br /&gt;
&lt;a class="m" href="http://compilers.iecc.com/crenshaw/" target="_blank"&gt;здесь&lt;/a&gt;. Парсер состоит из управляющего модуля и модулей занимающих парсингом. Можно сделать очень простой язык, можно сложный, зависит от набора модулей для парсинга. Обычно модуль это один файл содержащий в среднем 200 строк С-кода. В общем вещь достаточно тривиальная однако с её помощью можно делать сложные вещи (в моём случае даже лямбда-функции поддерживаются), самое приятное в том, что парсер самодокументирующийся. В сложных проектах документация постоянно отстаёт от кода, а здесь парсер всегда может выдать текущий синтаксис языка.&lt;br /&gt;
&lt;br /&gt;
Начальство не возражало против выкладывания исходников для парсера в открытый доступ, так что я его кинул на sourceforge. Лежит &lt;a class="m" href="http://sourceforge.net/projects/vandalix/?source=directory" target="_blank"&gt;здесь&lt;/a&gt;. Чтобы совсем уж не было всё голым слепил интерпретатор читающий скрипты из файла и выполняющий их. Для иллюстрации возможностей удалённого запуска процедур (RPC) сделал сервер для хранения файлов. Получение или загрузка файлов делается с помощью скриптов. Это значит, что можно запросить файл сжатый в bzip2 а затем закодированный MIME::Base64 или зашифрованный с помощью AES. В общем, игрушка &lt;img border='0' width='15' height='15' src='//rsdn.org/Forum/images/smile.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
Код написан на С, под Линукс. Документация кое-какая есть, правда на английском (писано для работодателя). В общем, может кому пригодится.&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Thu, 12 Mar 2015 14:31:24 GMT</pubDate>
		
			<author>v_andal &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>

	<item>
		<title>Подсчёт CRC для Тензо</title>
		<link>http://rsdn.org/Forum/src/5800559.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/5800559</guid>
		<comments>http://rsdn.org/Forum/src/5800559</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=5800559</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/5800559</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=5800559</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Перевод малюсенькой функции подсчёта CRC для кадра данных терминалов Тензо ТВ-006, Тензо ТВ-009, Тензо ТВ-011 из ассемблера MASM 6.x (входит в Visual C++ 6.0) в ассемблер &lt;a class="wikipedia m" href="http://ru.wikipedia.org/wiki/GCC_Inline_Assembly" target="_blank"&gt;GCC Inline Assembly&lt;/a&gt; (встроен в компиляторы GNU C, MinGW C++ ).&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='com'&gt;// MinGW C++&lt;/span&gt;

BYTE CRCMaker(BYTE b_input,BYTE b_CRC){
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"movb %0,%%al"&lt;/span&gt;::&lt;span class='str'&gt;"g"&lt;/span&gt;(b_input));
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"movb %0,%%ah"&lt;/span&gt;::&lt;span class='str'&gt;"g"&lt;/span&gt;(b_CRC));
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"mov $8,%cx"&lt;/span&gt;);
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"mod1: rol $1,%al"&lt;/span&gt;);
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"rcl $1,%ah"&lt;/span&gt;);
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"jnc mod2"&lt;/span&gt;);
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"xor $0x69,%ah"&lt;/span&gt;);
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"mod2: dec %cx"&lt;/span&gt;);
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"jnz mod1"&lt;/span&gt;);
    &lt;span class='kw'&gt;asm volatile&lt;/span&gt;(&lt;span class='str'&gt;"movb %%ah,%0"&lt;/span&gt;:&lt;span class='str'&gt;"=g"&lt;/span&gt;(b_CRC));
    &lt;span class='kw'&gt;return&lt;/span&gt; b_CRC;}&lt;/code&gt;&lt;/pre&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(//rsdn.org/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;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;// Visual &lt;span class='kw'&gt;C&lt;/span&gt;++

&lt;span class='kw'&gt;BYTE&lt;/span&gt; CRCMaker(&lt;span class='kw'&gt;BYTE&lt;/span&gt; b_input,&lt;span class='kw'&gt;BYTE&lt;/span&gt; b_CRC){
_asm{
      &lt;span class='kw'&gt;mov al&lt;/span&gt;,b_input
      &lt;span class='kw'&gt;mov ah&lt;/span&gt;,b_CRC
      &lt;span class='kw'&gt;mov cx&lt;/span&gt;,8
mod1: &lt;span class='kw'&gt;rol al&lt;/span&gt;,1
      &lt;span class='kw'&gt;rcl ah&lt;/span&gt;,1
      &lt;span class='kw'&gt;jnc&lt;/span&gt; mod2
      &lt;span class='kw'&gt;xor ah&lt;/span&gt;,69h
mod2: &lt;span class='kw'&gt;dec cx
      jnz&lt;/span&gt; mod1
      &lt;span class='kw'&gt;mov&lt;/span&gt; b_CRC,&lt;span class='kw'&gt;ah&lt;/span&gt;
    }
return b_CRC&lt;span class='com'&gt;;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;
				
		</description>
		
		<category>src</category>
		<pubDate>Mon, 29 Sep 2014 12:42:47 GMT</pubDate>
		
			<author>arc041209 &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>Сброс битмапов.</title>
		<link>http://rsdn.org/Forum/src/5348076.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/5348076</guid>
		<comments>http://rsdn.org/Forum/src/5348076</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=5348076</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/5348076</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=5348076</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Иногда бывает нужно в коде в целях отладки сбрасывать какие то изображения что бы посмотреть.&lt;br /&gt;
Например бывает очень нужно в OpenGL приложениях посмотреть что ушло в текстуру или что там получилось.&lt;br /&gt;
Во общем кидаю парочку простых функций для дампа в ppm/pbm которые можно быстро вставить и скомпилить.&lt;br /&gt;
Может кому то пригодится, одно замечание 32-битные изображения не могут быть сохранены в ppm/pbm формате и будут сконвертированы в 24-битные.&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(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;unsigned short&lt;/span&gt; calculate_stride(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; w, &lt;span class='kw'&gt;unsigned char&lt;/span&gt; bypp)
{
    &lt;span class='kw'&gt;unsigned short&lt;/span&gt; pitch = 0;

    pitch = w * bypp;
    &lt;span class='kw'&gt;switch&lt;/span&gt; (bypp&amp;lt;&amp;lt;3)
    {
    &lt;span class='kw'&gt;case&lt;/span&gt; 1: pitch = (pitch+7)/8; &lt;span class='kw'&gt;break&lt;/span&gt;;
    &lt;span class='kw'&gt;case&lt;/span&gt; 4: pitch = (pitch+1)/2; &lt;span class='kw'&gt;break&lt;/span&gt;;
    }

    &lt;span class='com'&gt;// 4-byte aligning&lt;/span&gt;
    pitch = (pitch + 3) &amp;amp; ~3;
    &lt;span class='kw'&gt;return&lt;/span&gt; pitch;
}


&lt;span class='kw'&gt;struct&lt;/span&gt; cm_RGB_2_RGB {
    &lt;span class='kw'&gt;enum&lt;/span&gt; {
        r = 0, g = 1, b = 2
    };
};

&lt;span class='kw'&gt;struct&lt;/span&gt; cm_BRG_2_RGB {
    &lt;span class='kw'&gt;enum&lt;/span&gt; {
        r = 1, g = 2, b = 0
    };
};

&lt;span class='kw'&gt;struct&lt;/span&gt; cm_BGR_2_RGB {
    &lt;span class='kw'&gt;enum&lt;/span&gt; {
        r = 2, g = 1, b = 0
    };
};

&lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt; &lt;span class='kw'&gt;typename&lt;/span&gt; color_model &amp;gt;
&lt;span class='kw'&gt;bool&lt;/span&gt;    graphics_algs::export_2ppm( &lt;span class='kw'&gt;unsigned int&lt;/span&gt; w, &lt;span class='kw'&gt;unsigned int&lt;/span&gt; h, &lt;span class='kw'&gt;int&lt;/span&gt; stride, &lt;span class='kw'&gt;unsigned char&lt;/span&gt; bypp, &lt;span class='kw'&gt;const void&lt;/span&gt;* data, std::ostream&amp;amp; stream )
{
    assert( stream.good() &amp;amp;&amp;amp; stream.flags() &amp;amp; std::ios::binary|std::ios::out);
    &lt;span class='kw'&gt;if&lt;/span&gt;( !stream.good() ) &lt;span class='kw'&gt;return false&lt;/span&gt;;

    stream &amp;lt;&amp;lt; (1 == bypp ? &lt;span class='str'&gt;"P5"&lt;/span&gt; : &lt;span class='str'&gt;"P6"&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span class='str'&gt;"\n"&lt;/span&gt;;
    stream &amp;lt;&amp;lt; w &amp;lt;&amp;lt; &lt;span class='str'&gt;"\n"&lt;/span&gt; &amp;lt;&amp;lt; h &amp;lt;&amp;lt; &lt;span class='str'&gt;"\n"&lt;/span&gt;;
    stream &amp;lt;&amp;lt; 255 &amp;lt;&amp;lt; &lt;span class='str'&gt;"\n"&lt;/span&gt;;

    &lt;span class='kw'&gt;if&lt;/span&gt;(4 == bypp) { &lt;span class='com'&gt;//convert to 24 bit PPM&lt;/span&gt;

        &lt;span class='kw'&gt;const unsigned short&lt;/span&gt; new_stride = calculate_stride(w, 3);

        &lt;span class='kw'&gt;for&lt;/span&gt;(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; r = 0;  r &amp;lt; h; ++r)
        {
            &lt;span class='kw'&gt;const unsigned char&lt;/span&gt; *_data = (&lt;span class='kw'&gt;const unsigned char&lt;/span&gt;*)data + (r*stride);
            &lt;span class='kw'&gt;for&lt;/span&gt;(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; c = 0; c &amp;lt; w; ++c)
            {
                stream.put(*(_data+c*4+color_model::r));
                stream.put(*(_data+c*4+color_model::g));
                stream.put(*(_data+c*4+color_model::b));
            }

            &lt;span class='kw'&gt;for&lt;/span&gt;(&lt;span class='kw'&gt;int&lt;/span&gt; s = 0; s &amp;lt; new_stride - (w*3); ++s) {
                stream.put(0);
            }
        }

    } &lt;span class='kw'&gt;else&lt;/span&gt; {
        &lt;span class='kw'&gt;for&lt;/span&gt;(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; y = 0; y &amp;lt; h; y++) {
            stream.write( (&lt;span class='kw'&gt;const char&lt;/span&gt;*)data + y * stride, w * bypp);
        }
    }

    &lt;span class='kw'&gt;return true&lt;/span&gt;;
}&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;
				
		</description>
		
		<category>src</category>
		<pubDate>Wed, 30 Oct 2013 16:16:07 GMT</pubDate>
		
			<author>nen777w &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>jquery.RuEn.js</title>
		<link>http://rsdn.org/Forum/src/5333000.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/5333000</guid>
		<comments>http://rsdn.org/Forum/src/5333000</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=5333000</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/5333000</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=5333000</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Написал плагин под JQuery, наверно кому-то будет интересно.&lt;br /&gt;
Вешается на текстовое поле, при вводе преобразует русские буквы в латинские. Полезно при вводе Email, например, можно не переключать языки ввода. Или в полях, где должна быть только латиница.&lt;br /&gt;
Бонусом ввод "@" кнопкой "~"("Ё").&lt;br /&gt;
Можно ругать, js только осваиваю &lt;img border='0' width='15' height='15' src='//rsdn.org/Forum/images/smile.gif' /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;(&lt;span class='kw'&gt;function&lt;/span&gt; ($)
{
    $.fn.ruEn = &lt;span class='kw'&gt;function&lt;/span&gt; ()
    {
        &lt;span class='kw'&gt;var&lt;/span&gt; charMap = {
            &lt;span class='str'&gt;"й"&lt;/span&gt;: &lt;span class='str'&gt;"q"&lt;/span&gt;,
            &lt;span class='str'&gt;"ц"&lt;/span&gt;: &lt;span class='str'&gt;"w"&lt;/span&gt;,
            &lt;span class='str'&gt;"у"&lt;/span&gt;: &lt;span class='str'&gt;"e"&lt;/span&gt;,
            &lt;span class='str'&gt;"к"&lt;/span&gt;: &lt;span class='str'&gt;"r"&lt;/span&gt;,
            &lt;span class='str'&gt;"е"&lt;/span&gt;: &lt;span class='str'&gt;"t"&lt;/span&gt;,
            &lt;span class='str'&gt;"н"&lt;/span&gt;: &lt;span class='str'&gt;"y"&lt;/span&gt;,
            &lt;span class='str'&gt;"г"&lt;/span&gt;: &lt;span class='str'&gt;"u"&lt;/span&gt;,
            &lt;span class='str'&gt;"ш"&lt;/span&gt;: &lt;span class='str'&gt;"i"&lt;/span&gt;,
            &lt;span class='str'&gt;"щ"&lt;/span&gt;: &lt;span class='str'&gt;"o"&lt;/span&gt;,
            &lt;span class='str'&gt;"з"&lt;/span&gt;: &lt;span class='str'&gt;"p"&lt;/span&gt;,
            &lt;span class='str'&gt;"ф"&lt;/span&gt;: &lt;span class='str'&gt;"a"&lt;/span&gt;,
            &lt;span class='str'&gt;"ы"&lt;/span&gt;: &lt;span class='str'&gt;"s"&lt;/span&gt;,
            &lt;span class='str'&gt;"в"&lt;/span&gt;: &lt;span class='str'&gt;"d"&lt;/span&gt;,
            &lt;span class='str'&gt;"а"&lt;/span&gt;: &lt;span class='str'&gt;"f"&lt;/span&gt;,
            &lt;span class='str'&gt;"п"&lt;/span&gt;: &lt;span class='str'&gt;"g"&lt;/span&gt;,
            &lt;span class='str'&gt;"р"&lt;/span&gt;: &lt;span class='str'&gt;"h"&lt;/span&gt;,
            &lt;span class='str'&gt;"о"&lt;/span&gt;: &lt;span class='str'&gt;"j"&lt;/span&gt;,
            &lt;span class='str'&gt;"л"&lt;/span&gt;: &lt;span class='str'&gt;"k"&lt;/span&gt;,
            &lt;span class='str'&gt;"д"&lt;/span&gt;: &lt;span class='str'&gt;"l"&lt;/span&gt;,
            &lt;span class='str'&gt;"я"&lt;/span&gt;: &lt;span class='str'&gt;"z"&lt;/span&gt;,
            &lt;span class='str'&gt;"ч"&lt;/span&gt;: &lt;span class='str'&gt;"x"&lt;/span&gt;,
            &lt;span class='str'&gt;"с"&lt;/span&gt;: &lt;span class='str'&gt;"c"&lt;/span&gt;,
            &lt;span class='str'&gt;"м"&lt;/span&gt;: &lt;span class='str'&gt;"v"&lt;/span&gt;,
            &lt;span class='str'&gt;"и"&lt;/span&gt;: &lt;span class='str'&gt;"b"&lt;/span&gt;,
            &lt;span class='str'&gt;"т"&lt;/span&gt;: &lt;span class='str'&gt;"n"&lt;/span&gt;,
            &lt;span class='str'&gt;"ь"&lt;/span&gt;: &lt;span class='str'&gt;"m"&lt;/span&gt;,
            &lt;span class='str'&gt;"Й"&lt;/span&gt;: &lt;span class='str'&gt;"Q"&lt;/span&gt;,
            &lt;span class='str'&gt;"Ц"&lt;/span&gt;: &lt;span class='str'&gt;"W"&lt;/span&gt;,
            &lt;span class='str'&gt;"У"&lt;/span&gt;: &lt;span class='str'&gt;"E"&lt;/span&gt;,
            &lt;span class='str'&gt;"К"&lt;/span&gt;: &lt;span class='str'&gt;"R"&lt;/span&gt;,
            &lt;span class='str'&gt;"Е"&lt;/span&gt;: &lt;span class='str'&gt;"T"&lt;/span&gt;,
            &lt;span class='str'&gt;"Н"&lt;/span&gt;: &lt;span class='str'&gt;"Y"&lt;/span&gt;,
            &lt;span class='str'&gt;"Г"&lt;/span&gt;: &lt;span class='str'&gt;"U"&lt;/span&gt;,
            &lt;span class='str'&gt;"Ш"&lt;/span&gt;: &lt;span class='str'&gt;"I"&lt;/span&gt;,
            &lt;span class='str'&gt;"Щ"&lt;/span&gt;: &lt;span class='str'&gt;"O"&lt;/span&gt;,
            &lt;span class='str'&gt;"З"&lt;/span&gt;: &lt;span class='str'&gt;"P"&lt;/span&gt;,
            &lt;span class='str'&gt;"Ф"&lt;/span&gt;: &lt;span class='str'&gt;"A"&lt;/span&gt;,
            &lt;span class='str'&gt;"Ы"&lt;/span&gt;: &lt;span class='str'&gt;"S"&lt;/span&gt;,
            &lt;span class='str'&gt;"В"&lt;/span&gt;: &lt;span class='str'&gt;"D"&lt;/span&gt;,
            &lt;span class='str'&gt;"А"&lt;/span&gt;: &lt;span class='str'&gt;"F"&lt;/span&gt;,
            &lt;span class='str'&gt;"П"&lt;/span&gt;: &lt;span class='str'&gt;"G"&lt;/span&gt;,
            &lt;span class='str'&gt;"Р"&lt;/span&gt;: &lt;span class='str'&gt;"H"&lt;/span&gt;,
            &lt;span class='str'&gt;"О"&lt;/span&gt;: &lt;span class='str'&gt;"J"&lt;/span&gt;,
            &lt;span class='str'&gt;"Л"&lt;/span&gt;: &lt;span class='str'&gt;"K"&lt;/span&gt;,
            &lt;span class='str'&gt;"Д"&lt;/span&gt;: &lt;span class='str'&gt;"L"&lt;/span&gt;,
            &lt;span class='str'&gt;"Я"&lt;/span&gt;: &lt;span class='str'&gt;"Z"&lt;/span&gt;,
            &lt;span class='str'&gt;"Ч"&lt;/span&gt;: &lt;span class='str'&gt;"X"&lt;/span&gt;,
            &lt;span class='str'&gt;"С"&lt;/span&gt;: &lt;span class='str'&gt;"C"&lt;/span&gt;,
            &lt;span class='str'&gt;"М"&lt;/span&gt;: &lt;span class='str'&gt;"V"&lt;/span&gt;,
            &lt;span class='str'&gt;"И"&lt;/span&gt;: &lt;span class='str'&gt;"B"&lt;/span&gt;,
            &lt;span class='str'&gt;"Т"&lt;/span&gt;: &lt;span class='str'&gt;"N"&lt;/span&gt;,
            &lt;span class='str'&gt;"Ь"&lt;/span&gt;: &lt;span class='str'&gt;"M"&lt;/span&gt;,
            &lt;span class='str'&gt;"ю"&lt;/span&gt;: &lt;span class='str'&gt;"."&lt;/span&gt;,
            &lt;span class='str'&gt;"Ю"&lt;/span&gt;: &lt;span class='str'&gt;"."&lt;/span&gt;,
            &lt;span class='str'&gt;"ё"&lt;/span&gt;: &lt;span class='str'&gt;"@"&lt;/span&gt;,
            &lt;span class='str'&gt;"Ё"&lt;/span&gt;: &lt;span class='str'&gt;"@"&lt;/span&gt;
        };
        &lt;span class='kw'&gt;return this&lt;/span&gt;.each(&lt;span class='kw'&gt;function&lt;/span&gt; ()
        {
            &lt;span class='kw'&gt;var&lt;/span&gt; $&lt;span class='kw'&gt;this&lt;/span&gt; = $(&lt;span class='kw'&gt;this&lt;/span&gt;);
            $&lt;span class='kw'&gt;this&lt;/span&gt;.on(&lt;span class='str'&gt;"keypress"&lt;/span&gt;, &lt;span class='kw'&gt;function&lt;/span&gt; (event)
            {
                &lt;span class='kw'&gt;if&lt;/span&gt; (event.which) {
                    &lt;span class='kw'&gt;var&lt;/span&gt; charStr = String.fromCharCode(event.which);
                    &lt;span class='kw'&gt;var&lt;/span&gt; transformedChar = transformTypedCharacter(charStr);
                    &lt;span class='kw'&gt;if&lt;/span&gt; (transformedChar != charStr) {
                        &lt;span class='kw'&gt;var&lt;/span&gt; sel = getInputSelection(&lt;span class='kw'&gt;this&lt;/span&gt;);
                        &lt;span class='kw'&gt;this&lt;/span&gt;.value = &lt;span class='kw'&gt;this&lt;/span&gt;.value.slice(0, sel.start) + transformedChar + &lt;span class='kw'&gt;this&lt;/span&gt;.value.slice(sel.end);
                        &lt;span class='com'&gt;// Move the caret&lt;/span&gt;
                        setInputSelection(&lt;span class='kw'&gt;this&lt;/span&gt;, sel.start + 1, sel.start + 1);
                        &lt;span class='kw'&gt;return false&lt;/span&gt;;
                    }
                }
            });
        });

        &lt;span class='kw'&gt;function&lt;/span&gt; transformTypedCharacter(typedChar)
        {
            &lt;span class='kw'&gt;return&lt;/span&gt; charMap[typedChar] || typedChar;
        }

        &lt;span class='kw'&gt;function&lt;/span&gt; setInputSelection(el, startOffset, endOffset)
        {
            el.focus();
            &lt;span class='kw'&gt;if&lt;/span&gt; (&lt;span class='kw'&gt;typeof&lt;/span&gt; el.selectionStart == &lt;span class='str'&gt;"number"&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class='kw'&gt;typeof&lt;/span&gt; el.selectionEnd == &lt;span class='str'&gt;"number"&lt;/span&gt;) {
                el.selectionStart = startOffset;
                el.selectionEnd = endOffset;
            } &lt;span class='kw'&gt;else&lt;/span&gt; {
                &lt;span class='kw'&gt;var&lt;/span&gt; range = el.createTextRange();
                &lt;span class='kw'&gt;var&lt;/span&gt; startCharMove = offsetToRangeCharacterMove(el, startOffset);
                range.collapse(&lt;span class='kw'&gt;true&lt;/span&gt;);
                &lt;span class='kw'&gt;if&lt;/span&gt; (startOffset == endOffset)
                    range.move(&lt;span class='str'&gt;"character"&lt;/span&gt;, startCharMove);
                &lt;span class='kw'&gt;else&lt;/span&gt; {
                    range.moveEnd(&lt;span class='str'&gt;"character"&lt;/span&gt;, offsetToRangeCharacterMove(el, endOffset));
                    range.moveStart(&lt;span class='str'&gt;"character"&lt;/span&gt;, startCharMove);
                }

                range.select();
            }
        }

        &lt;span class='kw'&gt;function&lt;/span&gt; offsetToRangeCharacterMove(el, offset)
        {
            &lt;span class='kw'&gt;return&lt;/span&gt; offset - (el.value.slice(0, offset).split(&lt;span class='str'&gt;"\r\n"&lt;/span&gt;).length - 1);
        }

        &lt;span class='kw'&gt;function&lt;/span&gt; getInputSelection(el)
        {
            &lt;span class='kw'&gt;var&lt;/span&gt; start = 0, end = 0, normalizedValue, range,
                textInputRange, len, endRange;

            &lt;span class='kw'&gt;if&lt;/span&gt; (&lt;span class='kw'&gt;typeof&lt;/span&gt; el.selectionStart == &lt;span class='str'&gt;"number"&lt;/span&gt; &amp;amp;&amp;amp; &lt;span class='kw'&gt;typeof&lt;/span&gt; el.selectionEnd == &lt;span class='str'&gt;"number"&lt;/span&gt;) {
                start = el.selectionStart;
                end = el.selectionEnd;
            } &lt;span class='kw'&gt;else&lt;/span&gt; {
                range = document.selection.createRange();

                &lt;span class='kw'&gt;if&lt;/span&gt; (range &amp;amp;&amp;amp; range.parentElement() == el) {
                    len = el.value.length;
                    normalizedValue = el.value.replace(/\r\n/g, &lt;span class='str'&gt;"\n"&lt;/span&gt;);

                    &lt;span class='com'&gt;// Create a working TextRange that lives only in the input&lt;/span&gt;
                    textInputRange = el.createTextRange();
                    textInputRange.moveToBookmark(range.getBookmark());

                    &lt;span class='com'&gt;// Check if the start and end of the selection are at the very end
                    // of the input, since moveStart/moveEnd doesn't return what we want in those cases&lt;/span&gt;
                    endRange = el.createTextRange();
                    endRange.collapse(&lt;span class='kw'&gt;false&lt;/span&gt;);

                    &lt;span class='kw'&gt;if&lt;/span&gt; (textInputRange.compareEndPoints(&lt;span class='str'&gt;"StartToEnd"&lt;/span&gt;, endRange) &amp;gt; -1)
                        start = end = len;
                    &lt;span class='kw'&gt;else&lt;/span&gt; {
                        start = -textInputRange.moveStart(&lt;span class='str'&gt;"character"&lt;/span&gt;, -len);
                        start += normalizedValue.slice(0, start).split(&lt;span class='str'&gt;"\n"&lt;/span&gt;).length - 1;

                        &lt;span class='kw'&gt;if&lt;/span&gt; (textInputRange.compareEndPoints(&lt;span class='str'&gt;"EndToEnd"&lt;/span&gt;, endRange) &amp;gt; -1)
                            end = len;
                        &lt;span class='kw'&gt;else&lt;/span&gt; {
                            end = -textInputRange.moveEnd(&lt;span class='str'&gt;"character"&lt;/span&gt;, -len);
                            end += normalizedValue.slice(0, end).split(&lt;span class='str'&gt;"\n"&lt;/span&gt;).length - 1;
                        }
                    }
                }
            }

            &lt;span class='kw'&gt;return&lt;/span&gt; { start: start, end: end };
        }
    };
})(jQuery);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Wed, 16 Oct 2013 11:03:38 GMT</pubDate>
		
			<author>Max404.NET &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>3</slash:comments>
		
	</item>

	<item>
		<title>Cloneable</title>
		<link>http://rsdn.org/Forum/src/5143961.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/5143961</guid>
		<comments>http://rsdn.org/Forum/src/5143961</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=5143961</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/5143961</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=5143961</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Не претендуя на новизну, больше на новичков&lt;br /&gt;
&lt;br /&gt;
Оператор копирования и паттерн Прототип&lt;br /&gt;
&lt;br /&gt;
Интуитивное копирование&lt;br /&gt;
&lt;br /&gt;
Заводим общую функцию для конструктора копирования и оператора присваивания:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;class&lt;/span&gt; C {
&lt;span class='kw'&gt;public&lt;/span&gt;:
    C(&lt;span class='kw'&gt;const&lt;/span&gt; C &amp;amp;rhs) {
        CopyFrom(rhs);
    }
 
    C &amp;amp;&lt;span class='kw'&gt;operator&lt;/span&gt; = (&lt;span class='kw'&gt;const&lt;/span&gt; C &amp;amp;rhs) {
        CopyFrom(rhs);
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }
 
    &lt;span class='kw'&gt;void&lt;/span&gt; CopyFrom(&lt;span class='kw'&gt;const&lt;/span&gt; C &amp;amp;rhs) {
        &lt;span class='com'&gt;//копируем данные&lt;/span&gt;
    }
};&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Безопасное копирование&lt;br /&gt;
&lt;br /&gt;
"В каждой функции следует собрать весь код, который может генерировать исключения, и выполнить его отдельно, безопасным с точки зрения исключений способом. Только после этого, когда вы будете знать, что вся реальная работа успешно выполнена, вы можете изменять состояние программы (а также выполнять другие необходимые действия, например, освобождение ресурсов) посредством операций, которые не генерируют исключений." [Герб Саттер, с. 122]&lt;br /&gt;
Соответствующая реализация "copy and swap" следует идиоме RAII (получение ресурса есть инициализация) [Мейерс, правило 13] и требует реализации конструктора копирования и функции Swap:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;class&lt;/span&gt; C {
&lt;span class='kw'&gt;public&lt;/span&gt;:
    C(&lt;span class='kw'&gt;const&lt;/span&gt; C &amp;amp;rhs) {
        &lt;span class='com'&gt;//код инициализации&lt;/span&gt;
    }
 
    C &amp;amp;&lt;span class='kw'&gt;operator&lt;/span&gt; = (&lt;span class='kw'&gt;const&lt;/span&gt; C &amp;amp;rhs) {
        C temp(rhs);
        Swap(temp);
        &lt;span class='kw'&gt;return&lt;/span&gt; *&lt;span class='kw'&gt;this&lt;/span&gt;;
    }
 
    &lt;span class='kw'&gt;void&lt;/span&gt; Swap(C &amp;amp;rhs) &lt;span class='kw'&gt;throw&lt;/span&gt;() {
        &lt;span class='com'&gt;//обмениваем указатели&lt;/span&gt;
    }
};&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Элегантное копирование&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&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;class&lt;/span&gt; Cloneable {
&lt;span class='kw'&gt;public&lt;/span&gt;:
    &lt;span class='kw'&gt;typedef&lt;/span&gt; Cloneable&amp;lt;T&amp;gt; baseClass;
 
    Cloneable() {}
 
    &lt;span class='kw'&gt;explicit&lt;/span&gt; Cloneable(&lt;span class='kw'&gt;const&lt;/span&gt; Cloneable &amp;amp;) {}
 
    &lt;span class='kw'&gt;virtual&lt;/span&gt; ~Cloneable() {}
 
    &lt;span class='kw'&gt;static&lt;/span&gt; T *New() {
        &lt;span class='kw'&gt;return new&lt;/span&gt; T;
    }
 
    T &amp;amp;&lt;span class='kw'&gt;operator&lt;/span&gt; = (&lt;span class='kw'&gt;const&lt;/span&gt; T &amp;amp;rhs) {
        &lt;span class='kw'&gt;if&lt;/span&gt; (This() != &amp;amp;rhs) {
            T temp(rhs);
            Swap(temp);
        }
        &lt;span class='kw'&gt;return&lt;/span&gt; *This();
    }
 
    &lt;span class='kw'&gt;virtual&lt;/span&gt; T *Clone() {
        &lt;span class='kw'&gt;return new&lt;/span&gt; T(*This());
    }
 
    &lt;span class='kw'&gt;virtual void&lt;/span&gt; Swap(T &amp;amp;) = 0;
 
    &lt;span class='kw'&gt;virtual&lt;/span&gt; T* This() = 0;
};
 
 
&lt;span class='kw'&gt;class&lt;/span&gt; C : &lt;span class='kw'&gt;public&lt;/span&gt; Cloneable&amp;lt;C&amp;gt; {
&lt;span class='kw'&gt;public&lt;/span&gt;:
    C(&lt;span class='kw'&gt;const&lt;/span&gt; C &amp;amp;rhs) {
        &lt;span class='com'&gt;//код инициализации&lt;/span&gt;
    }
 
    C *This() {
        &lt;span class='kw'&gt;return this&lt;/span&gt;;
    }
 
    &lt;span class='kw'&gt;void&lt;/span&gt; Swap(C &amp;amp;rhs) &lt;span class='kw'&gt;throw&lt;/span&gt;() {
        &lt;span class='com'&gt;//обмениваем указатели&lt;/span&gt;
    }
};&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ссылки&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Герб Саттер, Решение сложных задач на C++. Изд. Вильямс, 2002.&lt;br /&gt;
Скотт Мейерс. Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ, 2006.&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Sun, 21 Apr 2013 08:55:59 GMT</pubDate>
		
			<author>ST1 &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>DLLINFO -Big Trouble -загружает трой!?.</title>
		<link>http://rsdn.org/Forum/src/4967607.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/4967607</guid>
		<comments>http://rsdn.org/Forum/src/4967607</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=4967607</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/4967607</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=4967607</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Внимание! Имел у себя продолжительное время эту длл-ку и не мог нарадоваться. Недавно подхватил вирь со стр. в браузере. Вычислил и вычистил все файлы и сложил в папку. Но вот беда, при открытии браузером для отправки на сайт &lt;a class="m" href="http://www.virustotal.com" target="_blank"&gt;www.virustotal.com&lt;/a&gt; получил непонятные глюки(браузеры или зависают, или вырубаются). Выяснил, что как браузер, так и Totalcmd, так и Explorer загружают эту дллку(трой) в адресное пространство на исполнение, после чего все начинает глючить. Переименование не помогает. Обнаружил, что это именно dllinfo.dll осуществляют эту загрузку. Т.к. при выгрузке ее из памяти, загрузка троя прекращается.&lt;br /&gt;
&lt;br /&gt;
В исходниках не ковырялся, да и я не большой спец.&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Sat, 17 Nov 2012 09:21:49 GMT</pubDate>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>[ruby] выгрузка данных по логам ProcessMonitor</title>
		<link>http://rsdn.org/Forum/src/4948021.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/4948021</guid>
		<comments>http://rsdn.org/Forum/src/4948021</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=4948021</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/4948021</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=4948021</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;После выхода новой версии ProcessMonitor обнаружил, что теперь формат логов изменился. Вариантов выгрузки стало три XML,CSV и нативный формат тула. Решил CSV запарсировать.&lt;br /&gt;
&lt;br /&gt;
у тула два параметра&lt;br /&gt;
1) лог в формате csv&lt;br /&gt;
2) директория куда пойдет output&lt;br /&gt;
&lt;br /&gt;
тул удобен когда важно понять не только откуда читается, но и что&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;require "fileutils"

def processLog(file_name, len_offset)
  len_offset_params = len_offset.split /,/
  len    = (len_offset_params[1].split /:/)[1].gsub(/\u00A0/, "").gsub(/\s+/, "").gsub(/"/, "")
  offset = (len_offset_params[0].split /:/)[1].gsub(/\u00A0/, "").gsub(/\s+/, "").gsub(/"/, "")
  begin
    buffer = nil
    File.open file_name, 'rb' do |file|
      file.seek offset.to_i, IO::SEEK_SET
      buffer = file.read len.to_i
      $map_file.write("#{$log_file_num} #{file_name} #{offset} #{len}\n")
    end

    File.open $log_file_num.to_s, 'wb' do |file|
      file.write buffer
    end
  rescue Exception =&amp;gt; e
    p e.class
  end
end

p "call me ruby Logfile.CSV output_dir" and exit if ARGV.length != 2

lines = nil

File.open ARGV[0], 'r:bom|utf-8' do |file|
  lines = file.readlines
end
lines.delete_at 0 # lets remove the first line

output_directory = ARGV[1]
FileUtils.mkdir(output_directory) if !File.directory?(output_directory)
Dir.chdir output_directory

$map_file = File.open "map.txt", 'w'
$map_file.write "\xEF\xBB\xBF"

$log_file_num = 0
lines.each {|line|
  params = line.split '","'
  next if !params[3].eql?('ReadFile')
  processLog params[4], params[6]
  $log_file_num+=1
}

$map_file.close&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Wed, 31 Oct 2012 06:36:18 GMT</pubDate>
		
			<author>Jakop &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>RetroEvent - позволяющий делать операции в процессе ожидания</title>
		<link>http://rsdn.org/Forum/src/4907379.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/4907379</guid>
		<comments>http://rsdn.org/Forum/src/4907379</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=4907379</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/4907379</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=4907379</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Идея проста: позволить двойную проверку(double check).&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;								RetroEvent.h			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;#pragma&lt;/span&gt; once

&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;Windows.h&amp;gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;intrin.h&amp;gt;

&lt;span class='kw'&gt;class&lt;/span&gt; RetroEvent
{
&lt;span class='kw'&gt;public&lt;/span&gt;:
    RetroEvent();
    ~RetroEvent();

    &lt;span class='kw'&gt;__int64&lt;/span&gt; RequestWait();
    DWORD PerformWait(&lt;span class='kw'&gt;__int64&lt;/span&gt; index, DWORD timeout);
    &lt;span class='kw'&gt;void&lt;/span&gt; Set();
&lt;span class='kw'&gt;private&lt;/span&gt;:
    &lt;span class='kw'&gt;__int64&lt;/span&gt; m_setIndex, m_waitIndex, m_waitingCount;
    HANDLE m_eventHandle;
};&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;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;								RetroEvent.cpp			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"stdafx.h"&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"RetroEvent.h"&lt;/span&gt;

RetroEvent::RetroEvent()
{
    m_eventHandle = CreateEvent(NULL, TRUE, FALSE, NULL);
    m_setIndex = 0;
    m_waitIndex = 0;
    m_waitingCount = 0;
}
RetroEvent::~RetroEvent()
{
    CloseHandle(m_eventHandle);
}

&lt;span class='kw'&gt;__int64&lt;/span&gt; RetroEvent::RequestWait()
{
    &lt;span class='kw'&gt;return&lt;/span&gt; ::InterlockedIncrement64(&amp;amp;m_waitIndex);
}
DWORD RetroEvent::PerformWait(&lt;span class='kw'&gt;__int64&lt;/span&gt; index, DWORD timeout)
{
    DWORD begin = GetTickCount();
    DWORD res = STATUS_WAIT_0;
    &lt;span class='kw'&gt;while&lt;/span&gt; (&lt;span class='kw'&gt;true&lt;/span&gt;)
    {
        ::InterlockedIncrement64(&amp;amp;m_waitingCount);
        &lt;span class='kw'&gt;if&lt;/span&gt; (::InterlockedCompareExchange64(&amp;amp;m_setIndex,  0, 0) &amp;gt; index)
        {
            ::InterlockedDecrement64(&amp;amp;m_waitingCount);
            &lt;span class='kw'&gt;break&lt;/span&gt;;
        }

        DWORD now = GetTickCount();
        &lt;span class='kw'&gt;if&lt;/span&gt; ((now - begin) &amp;gt; timeout)
        {
            ::InterlockedDecrement64(&amp;amp;m_waitingCount);
            SetLastError(WAIT_TIMEOUT);
            res = WAIT_TIMEOUT;
            &lt;span class='kw'&gt;break&lt;/span&gt;;
        }
        DWORD toWait = timeout - (now - begin);
        res = WaitForSingleObject(m_eventHandle, toWait);
        &lt;span class='kw'&gt;if&lt;/span&gt; (res != STATUS_WAIT_0)
        {
            ::InterlockedDecrement64(&amp;amp;m_waitingCount);
            &lt;span class='kw'&gt;break&lt;/span&gt;;
        }    
        
        &lt;span class='kw'&gt;if&lt;/span&gt;(::InterlockedDecrement64(&amp;amp;m_waitingCount) == 0)
            &lt;span class='kw'&gt;continue&lt;/span&gt;;


        &lt;span class='kw'&gt;while&lt;/span&gt; (::InterlockedCompareExchange64(&amp;amp;m_waitingCount, 0, 0)) SwitchToThread();
    } 
    &lt;span class='kw'&gt;return&lt;/span&gt; res;

}
&lt;span class='kw'&gt;void&lt;/span&gt; RetroEvent::Set()
{
    &lt;span class='kw'&gt;__int64&lt;/span&gt; setIndex = RequestWait();
    &lt;span class='kw'&gt;__int64&lt;/span&gt; prevIndex = m_setIndex;
    &lt;span class='kw'&gt;if&lt;/span&gt; (prevIndex &amp;gt; setIndex)
        &lt;span class='kw'&gt;return&lt;/span&gt;;
    &lt;span class='kw'&gt;if&lt;/span&gt; (::InterlockedCompareExchange64(&amp;amp;m_setIndex,  setIndex, prevIndex) != prevIndex)
        &lt;span class='kw'&gt;return&lt;/span&gt;;
    ::InterlockedIncrement64(&amp;amp;m_waitingCount);
    SetEvent(m_eventHandle);
    &lt;span class='kw'&gt;while&lt;/span&gt; (::InterlockedCompareExchange64(&amp;amp;m_waitingCount, 0, 0) &amp;gt; 1) 
    {
        &lt;span class='kw'&gt;if&lt;/span&gt; (::InterlockedCompareExchange64(&amp;amp;m_setIndex,  0, 0) != setIndex)
        {
            ::InterlockedDecrement64(&amp;amp;m_waitingCount);
            &lt;span class='kw'&gt;return&lt;/span&gt;;
        }        
        SwitchToThread();
    }
    ResetEvent(m_eventHandle);
    ::InterlockedDecrement64(&amp;amp;m_waitingCount);
}&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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='//rsdn.org/Forum/images/sup.gif' /&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Wed, 26 Sep 2012 23:02:27 GMT</pubDate>
		
			<author>Caracrist &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>4</slash:comments>
		
	</item>

	<item>
		<title>[java] Пример proxy на асинхронных сокетах</title>
		<link>http://rsdn.org/Forum/src/4890501.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/4890501</guid>
		<comments>http://rsdn.org/Forum/src/4890501</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=4890501</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/4890501</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=4890501</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Но основе этого пример планировалось делать проброс JMX/RMI трафика между хостами.&lt;br /&gt;
Для примера запускается приложение с jmx path &lt;b&gt;service:jmx:&lt;a class="m" href="rmi://localhost:8084/jndi/rmi://localhost:8085/jmxrmi" target="_blank"&gt;rmi://localhost:8084/jndi/rmi://localhost:8085/jmxrmi&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Приложение ниже должно было слушать на портах 9000 и 9001 и пробрасывать весь трафик в обе стороны чтобы можно было соединиться&lt;br /&gt;
с помощью jconsole к портам 9000 и 9001 соответственно. Пример сырой но вполне рабочий чтобы понять что подходработает&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;import&lt;/span&gt; java.io.IOException;
&lt;span class='kw'&gt;import&lt;/span&gt; java.net.InetAddress;
&lt;span class='kw'&gt;import&lt;/span&gt; java.net.InetSocketAddress;
&lt;span class='kw'&gt;import&lt;/span&gt; java.nio.ByteBuffer;
&lt;span class='kw'&gt;import&lt;/span&gt; java.nio.channels.SelectionKey;
&lt;span class='kw'&gt;import&lt;/span&gt; java.nio.channels.Selector;
&lt;span class='kw'&gt;import&lt;/span&gt; java.nio.channels.ServerSocketChannel;
&lt;span class='kw'&gt;import&lt;/span&gt; java.nio.channels.SocketChannel;
&lt;span class='kw'&gt;import&lt;/span&gt; java.util.*;

&lt;span class='kw'&gt;public class&lt;/span&gt; Main {

    &lt;span class='kw'&gt;static&lt;/span&gt; Map&amp;lt;Integer, Integer&amp;gt; portMap = &lt;span class='kw'&gt;new&lt;/span&gt; HashMap&amp;lt;Integer, Integer&amp;gt;();

    &lt;span class='kw'&gt;static&lt;/span&gt; Map&amp;lt;SocketChannel, SocketChannel&amp;gt; proxy2JmxMap = &lt;span class='kw'&gt;new&lt;/span&gt; HashMap&amp;lt;SocketChannel, SocketChannel&amp;gt;();

    &lt;span class='kw'&gt;static&lt;/span&gt; Map&amp;lt;SocketChannel, SocketChannel&amp;gt; jmx2ProxyMap = &lt;span class='kw'&gt;new&lt;/span&gt; HashMap&amp;lt;SocketChannel, SocketChannel&amp;gt;();

    &lt;span class='kw'&gt;static&lt;/span&gt; Map&amp;lt;SocketChannel, List&amp;lt;&lt;span class='kw'&gt;byte&lt;/span&gt;[]&amp;gt;&amp;gt; writeOrder = &lt;span class='kw'&gt;new&lt;/span&gt; HashMap&amp;lt;SocketChannel, List&amp;lt;&lt;span class='kw'&gt;byte&lt;/span&gt;[]&amp;gt;&amp;gt;();


    &lt;span class='kw'&gt;private static void&lt;/span&gt; accept(SelectionKey key) &lt;span class='kw'&gt;throws&lt;/span&gt; IOException {
        ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();

        Integer jmxPort = portMap.get(serverChannel.socket().getLocalPort());

        &lt;span class='kw'&gt;if&lt;/span&gt;(jmxPort == &lt;span class='kw'&gt;null&lt;/span&gt;)
        {
            serverChannel.close();
            key.cancel();
            &lt;span class='kw'&gt;return&lt;/span&gt;;
        }

        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(&lt;span class='kw'&gt;false&lt;/span&gt;);
        socketChannel.connect(&lt;span class='kw'&gt;new&lt;/span&gt; InetSocketAddress(&lt;span class='str'&gt;"127.0.0.1"&lt;/span&gt;, jmxPort));
        socketChannel.register(key.selector(), SelectionKey.OP_CONNECT);

        SocketChannel channel = serverChannel.accept();
        channel.configureBlocking(&lt;span class='kw'&gt;false&lt;/span&gt;);

        jmx2ProxyMap.put(socketChannel, channel);
        proxy2JmxMap.put(channel, socketChannel);

        channel.register(key.selector(), SelectionKey.OP_READ);
    }

    &lt;span class='kw'&gt;private static void&lt;/span&gt; connect(SelectionKey key) {
        SocketChannel sChannel = (SocketChannel)key.channel();

        &lt;span class='kw'&gt;boolean&lt;/span&gt; success = &lt;span class='kw'&gt;false&lt;/span&gt;;
        &lt;span class='kw'&gt;try&lt;/span&gt; {
            success = sChannel.finishConnect();
        } &lt;span class='kw'&gt;catch&lt;/span&gt; (IOException e) {
            e.printStackTrace();  &lt;span class='com'&gt;//To change body of catch statement use File | Settings | File Templates.&lt;/span&gt;
        }
        &lt;span class='kw'&gt;if&lt;/span&gt; (!success) {
            &lt;span class='com'&gt;// An error occurred; handle it

            // Unregister the channel with this selector&lt;/span&gt;
            key.cancel();
        }
        &lt;span class='kw'&gt;int&lt;/span&gt; ops = key.interestOps();

        &lt;span class='kw'&gt;if&lt;/span&gt;((ops &amp;amp; SelectionKey.OP_WRITE) != 0)
        {
            key.interestOps(SelectionKey.OP_WRITE);
        }
        &lt;span class='kw'&gt;else&lt;/span&gt;
        {
            key.interestOps(SelectionKey.OP_READ);
        }
    }

    &lt;span class='kw'&gt;private static void&lt;/span&gt; read(SelectionKey key) &lt;span class='kw'&gt;throws&lt;/span&gt; IOException {

        SocketChannel source = (SocketChannel) key.channel();
        SocketChannel destination = jmx2ProxyMap.get(source);

        &lt;span class='kw'&gt;if&lt;/span&gt;(destination == &lt;span class='kw'&gt;null&lt;/span&gt;)
        {
            destination = proxy2JmxMap.get(source);
        }
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        &lt;span class='kw'&gt;int&lt;/span&gt; numRead = -1;

        &lt;span class='kw'&gt;try&lt;/span&gt; {
            numRead = source.read(buffer);
        }
        &lt;span class='kw'&gt;catch&lt;/span&gt; (IOException e) {
            e.printStackTrace();
        }

        &lt;span class='kw'&gt;if&lt;/span&gt; (numRead == -1) {
            source.close();
            key.cancel();
            &lt;span class='kw'&gt;return&lt;/span&gt;;
        }

        List&amp;lt;&lt;span class='kw'&gt;byte&lt;/span&gt;[]&amp;gt; order = writeOrder.get(destination);
        &lt;span class='kw'&gt;if&lt;/span&gt;(order == &lt;span class='kw'&gt;null&lt;/span&gt;)
        {
            order = &lt;span class='kw'&gt;new&lt;/span&gt; ArrayList&amp;lt;&lt;span class='kw'&gt;byte&lt;/span&gt;[]&amp;gt;();
            writeOrder.put(destination, order);
        }

        &lt;span class='kw'&gt;byte&lt;/span&gt;[] data = &lt;span class='kw'&gt;new byte&lt;/span&gt;[numRead];
        System.arraycopy(buffer.array(), 0, data, 0, numRead);

        order.add(data);

        SelectionKey destkey = destination.keyFor(key.selector());

        destkey.interestOps(SelectionKey.OP_WRITE);
    }

    &lt;span class='kw'&gt;private static void&lt;/span&gt; write(SelectionKey key) &lt;span class='kw'&gt;throws&lt;/span&gt; IOException {
        SocketChannel channel = (SocketChannel) key.channel();
        List&amp;lt;&lt;span class='kw'&gt;byte&lt;/span&gt;[]&amp;gt; pendingData = writeOrder.get(channel);
        Iterator&amp;lt;&lt;span class='kw'&gt;byte&lt;/span&gt;[]&amp;gt; items = pendingData.iterator();
        &lt;span class='kw'&gt;while&lt;/span&gt; (items.hasNext()) {
            &lt;span class='kw'&gt;byte&lt;/span&gt;[] item = items.next();
            items.remove();
            channel.write(ByteBuffer.wrap(item));
        }
        key.interestOps(SelectionKey.OP_READ);
    }


    &lt;span class='kw'&gt;public static void&lt;/span&gt; main(String[] args) &lt;span class='kw'&gt;throws&lt;/span&gt; Exception {
        Selector proxySelector = Selector.open();

        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        serverChannel.configureBlocking(&lt;span class='kw'&gt;false&lt;/span&gt;);
        &lt;span class='com'&gt;// bind to port&lt;/span&gt;
        InetSocketAddress listenAddr = &lt;span class='kw'&gt;new&lt;/span&gt; InetSocketAddress((InetAddress)&lt;span class='kw'&gt;null&lt;/span&gt;, 9000);
        serverChannel.socket().bind(listenAddr);
        serverChannel.register(proxySelector, SelectionKey.OP_ACCEPT);

        ServerSocketChannel serverChannel2 = ServerSocketChannel.open();
        serverChannel2.configureBlocking(&lt;span class='kw'&gt;false&lt;/span&gt;);

        InetSocketAddress listenAddr2 = &lt;span class='kw'&gt;new&lt;/span&gt; InetSocketAddress((InetAddress)&lt;span class='kw'&gt;null&lt;/span&gt;, 9001);
        serverChannel2.socket().bind(listenAddr2);
        serverChannel2.register(proxySelector, SelectionKey.OP_ACCEPT);

        portMap.put(9000, 8084);
        portMap.put(9001, 8085);
        &lt;span class='kw'&gt;try&lt;/span&gt;
        {
            &lt;span class='com'&gt;// processing&lt;/span&gt;
            &lt;span class='kw'&gt;while&lt;/span&gt; (&lt;span class='kw'&gt;true&lt;/span&gt;) {
                &lt;span class='com'&gt;// wait for events&lt;/span&gt;
                proxySelector.select();

                &lt;span class='com'&gt;// wakeup to work on selected keys&lt;/span&gt;
                Iterator keys = proxySelector.selectedKeys().iterator();
                &lt;span class='kw'&gt;while&lt;/span&gt; (keys.hasNext()) {
                    SelectionKey key = (SelectionKey) keys.next();

                    &lt;span class='kw'&gt;if&lt;/span&gt; (! key.isValid()) {
                        &lt;span class='kw'&gt;continue&lt;/span&gt;;
                    }

                    &lt;span class='com'&gt;// this is necessary to prevent the same key from coming up
                    // again the next time around.&lt;/span&gt;
                    keys.remove();

                    &lt;span class='kw'&gt;if&lt;/span&gt; (key.isAcceptable()) {
                        accept(key);
                    }
                    &lt;span class='kw'&gt;else if&lt;/span&gt;(key.isConnectable())
                    {
                        connect(key);
                    }
                    &lt;span class='kw'&gt;else if&lt;/span&gt; (key.isReadable()) {
                        read(key);
                    }
                    &lt;span class='kw'&gt;else if&lt;/span&gt; (key.isWritable()) {
                        write(key);
                    }
                }
            }
        }
        &lt;span class='kw'&gt;catch&lt;/span&gt; (Exception e)
        {
            e.printStackTrace();
        }
    }

}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Thu, 13 Sep 2012 00:19:05 GMT</pubDate>
		
			<author>Jakop &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>0</slash:comments>
		
	</item>

	<item>
		<title>job waiter/workers [boost based]</title>
		<link>http://rsdn.org/Forum/src/4864682.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/4864682</guid>
		<comments>http://rsdn.org/Forum/src/4864682</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=4864682</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/4864682</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=4864682</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;С недавнего времени обзавелся вот таким самописным лисапедом, делюсь может кому то пригодится:&lt;br /&gt;
Суть такая:&lt;br /&gt;
&amp;mdash; нужно было много рабочих потоков которые обрабатывают данные для основного&lt;br /&gt;
&amp;mdash; функции рабочих потоков могут иметь разные сигнатуры, так как входные данные тоже разные&lt;br /&gt;
&amp;mdash; в один момент времени основной поток может обработать данные только одного рабочего потока&lt;br /&gt;
&amp;mdash; основной поток получает нотификацию от рабочего когда данные для него готовы, остальные становятся в очередь&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(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;&lt;span class='com'&gt;//функция рабочего потока получает интерфейс и (jobID) через который уведомляет что работа закончилась.
//может вернуть true, если требуется ещё одна итерация или false если рабочий поток больше не нужен. &lt;/span&gt;
&lt;span class='kw'&gt;bool&lt;/span&gt;  job_thread(JOB::I_job_pool_worker* p, &lt;span class='kw'&gt;unsigned int&lt;/span&gt; jobID)
{
    &lt;span class='com'&gt;//это рабочий поток здесь готовим данные (что то грузим с диска/динамически генерируем и т.д.)
    //и сообщаем основному потоку что данные готовы&lt;/span&gt;
    &lt;span class='kw'&gt;void&lt;/span&gt; *pData = ....
    p-&amp;gt;notify( pData ); &lt;span class='com'&gt;//можно просто p-&amp;gt;notify() - тогда в основном потоке ориентируемся на ID&lt;/span&gt;
    &lt;span class='kw'&gt;return true&lt;/span&gt;;
}

&lt;span class='com'&gt;//функция основного потока ожидающая данные от любого рабочего потока, 
//и нотифицирующая его (по ID) что обработка данных закончена и можно продолжать работу.&lt;/span&gt;
&lt;span class='kw'&gt;void&lt;/span&gt;  job_waiter(JOB::I_job_pool_waiter* p)
{
    &lt;span class='kw'&gt;unsigned int&lt;/span&gt; id = -1;
    &lt;span class='kw'&gt;void&lt;/span&gt;* pData = NULL;
    
    &lt;span class='kw'&gt;while&lt;/span&gt;(p-&amp;gt;wait(&amp;amp;id, &amp;amp;pData)) 
    &lt;span class='com'&gt;//или просто while(p-&amp;gt;wait(&amp;amp;id)) - если ориентируемся по ID (в id будет записан идентификатор рабочего потока от которого пришло сообщение)&lt;/span&gt;
    {
        &lt;span class='com'&gt;//основной поток что то делает с данными
        //и после сообщает рабочему потоку что его данные успешно обработаны&lt;/span&gt;
        p-&amp;gt;processed();
    }
}

&lt;span class='kw'&gt;int&lt;/span&gt; main() {
    
    &lt;span class='com'&gt;//создаем pool на 45 рабочих потоков, не беда если подпишемся не на все&lt;/span&gt;
    &lt;span class='kw'&gt;const unsigned int&lt;/span&gt; total_job = 45; 
    JOB::job_pool    pool(total_job);
    
    &lt;span class='kw'&gt;for&lt;/span&gt;( &lt;span class='kw'&gt;unsigned int&lt;/span&gt; n = 0; n &amp;lt; total_job-2; ++n )
    {
      pool.subscribe_job_thread(n, boost::bind(&amp;amp;job_thread, _1, _2));
    }

    &lt;span class='com'&gt;//функции рабочих потоков могут иметь разные сигнатуры&lt;/span&gt;
    &lt;span class='kw'&gt;int&lt;/span&gt; n = ...;
    pool.subscribe_job_thread(n, boost::bind(&amp;amp;job_thread_2, _1, _2, 10, boost::ref(n)));
    
    &lt;span class='com'&gt;//запускаем наш пул&lt;/span&gt;
    pool.run(boost::bind(&amp;amp;job_waiter, _1));   

    &lt;span class='kw'&gt;return&lt;/span&gt; 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;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(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;#ifndef&lt;/span&gt; __job_pool_h__
&lt;span class='kw'&gt;#define&lt;/span&gt; __job_pool_h__

&lt;span class='com'&gt;//boost&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"boost/function.hpp"&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"boost/thread.hpp"&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"boost/thread/locks.hpp"&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"boost/function.hpp"&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"boost/bind.hpp"&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"boost/shared_array.hpp"&lt;/span&gt;
&lt;span class='com'&gt;//std&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;map&amp;gt;

&lt;span class='kw'&gt;namespace&lt;/span&gt; JOB {
&lt;span class='com'&gt;//........................................................................&lt;/span&gt;
  &lt;span class='kw'&gt;class&lt;/span&gt;  I_job_pool_waiter
  {
  &lt;span class='kw'&gt;public&lt;/span&gt;:
    &lt;span class='kw'&gt;virtual bool&lt;/span&gt;  wait( &lt;span class='kw'&gt;unsigned int&lt;/span&gt;* jobID, &lt;span class='kw'&gt;void&lt;/span&gt; **user_data = NULL ) = 0;
    &lt;span class='kw'&gt;virtual void&lt;/span&gt;  processed() = 0;
  };
&lt;span class='com'&gt;//........................................................................&lt;/span&gt;
  &lt;span class='kw'&gt;class&lt;/span&gt;  I_job_pool_worker
  {
  &lt;span class='kw'&gt;public&lt;/span&gt;:
    &lt;span class='kw'&gt;virtual void&lt;/span&gt;  notify( &lt;span class='kw'&gt;void&lt;/span&gt;* user_data = NULL ) = 0;
  };
&lt;span class='com'&gt;//........................................................................
//........................................................................&lt;/span&gt;
  &lt;span class='kw'&gt;class&lt;/span&gt;  job_pool : &lt;span class='kw'&gt;public&lt;/span&gt; I_job_pool_waiter, &lt;span class='kw'&gt;public&lt;/span&gt; I_job_pool_worker
  {
    &lt;span class='com'&gt;//interface I_job_pool_waiter&lt;/span&gt;
  &lt;span class='kw'&gt;private&lt;/span&gt;:
    &lt;span class='com'&gt;//call when waiter ready for process job&lt;/span&gt;
    &lt;span class='kw'&gt;virtual bool&lt;/span&gt;  wait( &lt;span class='kw'&gt;unsigned int&lt;/span&gt;* jobID, &lt;span class='kw'&gt;void&lt;/span&gt; **user_data = NULL )
    {
      &lt;span class='com'&gt;//wait for notify about data&lt;/span&gt;
      boost::unique_lock&amp;lt;boost::mutex&amp;gt; lock_waiter(m_mtx_waiter);
      &lt;span class='kw'&gt;if&lt;/span&gt;( active_jobs() ) 
      { &lt;span class='com'&gt;//if !finish&lt;/span&gt;
        &lt;span class='kw'&gt;if&lt;/span&gt;(-1 == m_job_done_ID)
          m_cond_main.wait(m_mtx_waiter);

        &lt;span class='kw'&gt;if&lt;/span&gt;( -1 == m_job_done_ID ) &lt;span class='kw'&gt;return false&lt;/span&gt;;

        assert(-1 != m_job_done_ID);
        *jobID = m_job_done_ID;
        m_job_done_ID = -1;
        &lt;span class='kw'&gt;if&lt;/span&gt;(NULL != user_data) { *user_data = m_user_data; m_user_data = NULL; }

        &lt;span class='kw'&gt;return true&lt;/span&gt;;
      }

      &lt;span class='com'&gt;//no job&lt;/span&gt;
      &lt;span class='kw'&gt;return false&lt;/span&gt;;
    }

    &lt;span class='com'&gt;//call when waiter processed job&lt;/span&gt;
    &lt;span class='kw'&gt;virtual void&lt;/span&gt;  processed()
    {
      m_cond_main.notify_one();
    }

    &lt;span class='com'&gt;//interface I_job_pool_worker&lt;/span&gt;
  &lt;span class='kw'&gt;private&lt;/span&gt;:
    &lt;span class='com'&gt;//call when work thread want notify that job is done&lt;/span&gt;
    &lt;span class='kw'&gt;virtual void&lt;/span&gt;  notify( &lt;span class='kw'&gt;void&lt;/span&gt;* user_data = NULL )
    {
      &lt;span class='com'&gt;//only one job thread can enter to here&lt;/span&gt;
      boost::lock_guard&amp;lt;boost::mutex&amp;gt; lock_guard(m_mtx_notify);

      &lt;span class='com'&gt;//no any other job&lt;/span&gt;
      assert(-1 == m_job_done_ID &amp;amp;&amp;amp; NULL == m_user_data);
      boost::unique_lock&amp;lt;boost::mutex&amp;gt; lock_waiter(m_mtx_waiter);  

      &lt;span class='com'&gt;//set jobID and data&lt;/span&gt;
      m_job_done_ID = threadID_to_jobID(boost::this_thread::get_id());
      m_user_data = user_data;
      
      &lt;span class='com'&gt;//notify to main thread that job is ready for processed and wait&lt;/span&gt;
      m_cond_main.notify_all();
      m_cond_main.wait(m_mtx_waiter);
    }

  &lt;span class='kw'&gt;public&lt;/span&gt;:
    job_pool(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; threads_count)
      : m_connection(&lt;span class='kw'&gt;new&lt;/span&gt; connection_info[threads_count])
      , m_total_job_threads(threads_count)
      , m_job_counter(0)
      , m_job_done_ID(-1)
      , m_user_data(NULL)
    {}

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt; &lt;span class='kw'&gt;typename&lt;/span&gt; F &amp;gt;
    &lt;span class='kw'&gt;bool&lt;/span&gt;  subscribe_job_thread(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; jobID, F work_thread_funk)
    {
      &lt;span class='kw'&gt;if&lt;/span&gt;( !is_exist_jobID(jobID) &amp;amp;&amp;amp; m_job_counter &amp;gt; m_total_job_threads ) &lt;span class='kw'&gt;return false&lt;/span&gt;;

      &lt;span class='kw'&gt;unsigned int&lt;/span&gt; jobIDX = 0;
      &lt;span class='kw'&gt;if&lt;/span&gt;( is_exist_jobID(jobID) ) {
        &lt;span class='com'&gt;//job already exist&lt;/span&gt;
        jobIDX = jobID_to_jobIDX(jobID);
      } &lt;span class='kw'&gt;else&lt;/span&gt; {
        &lt;span class='com'&gt;//new job&lt;/span&gt;
        jobIDX = m_job_counter++;
      }
      
      &lt;span class='com'&gt;//subscribe&lt;/span&gt;
      m_connection[jobIDX].m_thread_fn = work_thread_funk;
      m_map_jobID_con_info_IDX[jobID] = jobIDX;
    
      &lt;span class='kw'&gt;return true&lt;/span&gt;;
    }

    &lt;span class='kw'&gt;template&lt;/span&gt;&amp;lt; &lt;span class='kw'&gt;typename&lt;/span&gt; F &amp;gt;
    &lt;span class='kw'&gt;void&lt;/span&gt;  run(F main_thread_funk) 
    {
      create_job_threads();
      main_thread_funk((I_job_pool_waiter*)&lt;span class='kw'&gt;this&lt;/span&gt;);
      
      &lt;span class='com'&gt;//wait while all threads done&lt;/span&gt;
      m_tg.join_all();
    }

  &lt;span class='kw'&gt;private&lt;/span&gt;:
    &lt;span class='kw'&gt;void&lt;/span&gt;  job_thread(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; jobID)
    {
      register_threadID(boost::this_thread::get_id(), jobID);

      &lt;span class='kw'&gt;bool&lt;/span&gt; bContinue = &lt;span class='kw'&gt;true&lt;/span&gt;;
      &lt;span class='kw'&gt;while&lt;/span&gt;( bContinue ) 
      {
        bContinue = m_connection[jobID_to_jobIDX(jobID)].m_thread_fn((I_job_pool_worker*)&lt;span class='kw'&gt;this&lt;/span&gt;, jobID);
      }
      
      &lt;span class='kw'&gt;if&lt;/span&gt;(0 == dec_job_counter()) {
        boost::unique_lock&amp;lt;boost::mutex&amp;gt; lock_waiter(m_mtx_waiter);    
        m_cond_main.notify_all();
      }
    }

    &lt;span class='kw'&gt;void&lt;/span&gt;  create_job_threads()
    {
      &lt;span class='kw'&gt;for&lt;/span&gt;( map_uiui::const_iterator it = m_map_jobID_con_info_IDX.begin(), itE = m_map_jobID_con_info_IDX.end(); it != itE; ++it)
      {
        m_tg.create_thread(boost::bind(&amp;amp;job_pool::job_thread, &lt;span class='kw'&gt;this&lt;/span&gt;, (*it).first));
      }
    }

  &lt;span class='kw'&gt;private&lt;/span&gt;:
    &lt;span class='kw'&gt;bool&lt;/span&gt;  is_exist_jobID(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; jobID) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
      &lt;span class='kw'&gt;return&lt;/span&gt; m_map_jobID_con_info_IDX.end() != m_map_jobID_con_info_IDX.find(jobID);
    }

    &lt;span class='kw'&gt;unsigned int&lt;/span&gt; jobID_to_jobIDX(&lt;span class='kw'&gt;unsigned int&lt;/span&gt; jobID) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
      map_uiui::const_iterator it = m_map_jobID_con_info_IDX.find(jobID);
      assert( m_map_jobID_con_info_IDX.end() != it );
      &lt;span class='kw'&gt;return&lt;/span&gt; (*it).second;
    }

    &lt;span class='kw'&gt;unsigned int&lt;/span&gt; threadID_to_jobID(boost::thread::id threadID) &lt;span class='kw'&gt;const&lt;/span&gt;
    {
      map_thID_ui::const_iterator it = m_map_ThreadID_to_jobID.find(threadID);
      assert( m_map_ThreadID_to_jobID.end() != it );
      &lt;span class='kw'&gt;return&lt;/span&gt; (*it).second;
    }

    &lt;span class='kw'&gt;void&lt;/span&gt;  register_threadID(boost::thread::id threadID, &lt;span class='kw'&gt;unsigned int&lt;/span&gt; jobID)
    {
      boost::lock_guard&amp;lt;boost::mutex&amp;gt; lock(m_mtx_rc);
      m_map_ThreadID_to_jobID[threadID] = jobID;
    }

    &lt;span class='kw'&gt;unsigned int&lt;/span&gt; active_jobs() {
      boost::lock_guard&amp;lt;boost::mutex&amp;gt; lock(m_mtx_counter);
      &lt;span class='kw'&gt;return&lt;/span&gt; m_job_counter;
    }

    &lt;span class='kw'&gt;unsigned int&lt;/span&gt; dec_job_counter() {
      boost::lock_guard&amp;lt;boost::mutex&amp;gt; lock(m_mtx_counter);
      &lt;span class='kw'&gt;return&lt;/span&gt; --m_job_counter;
    }

  &lt;span class='kw'&gt;private&lt;/span&gt;:
    &lt;span class='kw'&gt;typedef&lt;/span&gt; boost::function&amp;lt;&lt;span class='kw'&gt;bool&lt;/span&gt;(I_job_pool_worker*, &lt;span class='kw'&gt;unsigned int&lt;/span&gt;)&amp;gt; job_worker_fn;

    &lt;span class='kw'&gt;struct&lt;/span&gt;  connection_info 
    {
      job_worker_fn      m_thread_fn;
    };

    &lt;span class='kw'&gt;typedef&lt;/span&gt; boost::shared_array&amp;lt;connection_info&amp;gt; sh_a_connections;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; std::map&amp;lt;&lt;span class='kw'&gt;unsigned int&lt;/span&gt;, &lt;span class='kw'&gt;unsigned int&lt;/span&gt;&amp;gt; map_uiui;
    &lt;span class='kw'&gt;typedef&lt;/span&gt; std::map&amp;lt;boost::thread::id, &lt;span class='kw'&gt;unsigned int&lt;/span&gt;&amp;gt;   map_thID_ui;

    map_uiui      m_map_jobID_con_info_IDX;
    map_thID_ui      m_map_ThreadID_to_jobID;
    sh_a_connections  m_connection;

  &lt;span class='kw'&gt;private&lt;/span&gt;:
    &lt;span class='kw'&gt;const unsigned int&lt;/span&gt;    m_total_job_threads;
    &lt;span class='kw'&gt;volatile unsigned&lt;/span&gt;    m_job_counter;
    &lt;span class='kw'&gt;volatile unsigned int&lt;/span&gt;  m_job_done_ID;
    &lt;span class='kw'&gt;void&lt;/span&gt;*          m_user_data;

    boost::thread_group        m_tg;
    boost::condition_variable_any  m_cond_main;
    boost::mutex          m_mtx_waiter;
    boost::mutex          m_mtx_counter;
    boost::mutex          m_mtx_notify;
    boost::mutex          m_mtx_rc;
  };
} &lt;span class='com'&gt;//JOB ns&lt;/span&gt;

&lt;span class='kw'&gt;#endif&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;
				
		</description>
		
		<category>src</category>
		<pubDate>Wed, 22 Aug 2012 14:00:53 GMT</pubDate>
		
			<author>nen777w &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>2</slash:comments>
		
	</item>

	<item>
		<title>statusLine</title>
		<link>http://rsdn.org/Forum/src/4788134.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/4788134</guid>
		<comments>http://rsdn.org/Forum/src/4788134</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=4788134</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/4788134</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=4788134</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Сделал все по примеру, метод &lt;br /&gt;
public void HelloWorld()&lt;br /&gt;
        {&lt;br /&gt;
            MessageBox.Show("Hello World!");&lt;br /&gt;
            statusLine.SetStatusLine("Yoyoyo");&lt;br /&gt;
        }&lt;br /&gt;
из 1с вызывается, MessageBox показывает. Но на строчку &lt;br /&gt;
statusLine.SetStatusLine("Yoyoyo");&lt;br /&gt;
ругается, говорит, что в ней NullReferenceException. Интерфейс IInitDone имплементировал.&lt;br /&gt;
То же самое при обращении к методам asyncEvent.&lt;br /&gt;
public void Done() { }&lt;br /&gt;
        public void GetInfo([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]&lt;br /&gt;
          ref object[] info)&lt;br /&gt;
        {&lt;br /&gt;
            info[0] = 2000;&lt;br /&gt;
        }&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Инициализация компонента&lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name="connection"&amp;gt;reference to IDispatch&amp;lt;/param&amp;gt;&lt;br /&gt;
        public void Init([MarshalAs(UnmanagedType.IDispatch)]&lt;br /&gt;
            object connection)&lt;br /&gt;
        {&lt;br /&gt;
            asyncEvent = (IAsyncEvent)connection;&lt;br /&gt;
            statusLine = (IStatusLine)connection;&lt;br /&gt;
        }&lt;br /&gt;
Подскажите, в чем дело?&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Thu, 21 Jun 2012 15:50:34 GMT</pubDate>
		
			<author>tsdaemon &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Подсчет строк кода (и не только) с отчетом в IE (vbscript)</title>
		<link>http://rsdn.org/Forum/src/4723923.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/4723923</guid>
		<comments>http://rsdn.org/Forum/src/4723923</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=4723923</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/4723923</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=4723923</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Использование:&lt;br /&gt;
1) Помещаем код в vbs файл, например linescounter.vbs&lt;br /&gt;
2) Выделяем в папке интересующие файлы (любого типа, не обязательно сорсы) и переносим на файл скрипта. Появится IE с таблицей отчета&lt;br /&gt;
2) В коде булевый параметр skipEmpty задает игнорирование пустых строк (определяется через Trim; по умолчанию 0)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class='c'&gt;&lt;code&gt;&lt;span class='com'&gt;' VB Script Document&lt;/span&gt;
&lt;span class='kw'&gt;option explicit

Const&lt;/span&gt; thisScriptName = &lt;span class='str'&gt;"linescounter.vbs"&lt;/span&gt;

&lt;span class='kw'&gt;Const&lt;/span&gt; ForReading = 1

&lt;span class='com'&gt;'если запускаем скрипт автономно&lt;/span&gt;
&lt;span class='kw'&gt;if&lt;/span&gt; WScript.ScriptName = thisScriptName &lt;span class='kw'&gt;then
    if&lt;/span&gt; WScript.Arguments.&lt;span class='kw'&gt;Count&lt;/span&gt; &amp;gt; 0  &lt;span class='kw'&gt;then        
        Dim&lt;/span&gt; cb
        &lt;span class='kw'&gt;set&lt;/span&gt; cb = &lt;span class='kw'&gt;new&lt;/span&gt; FindFileCallback

        &lt;span class='kw'&gt;Dim&lt;/span&gt; fname
        &lt;span class='kw'&gt;Dim&lt;/span&gt; res
        &lt;span class='kw'&gt;for each&lt;/span&gt; fname &lt;span class='kw'&gt;in&lt;/span&gt; WScript.Arguments
            res = cb.Found(fname)
            &lt;span class='kw'&gt;If&lt;/span&gt; res(0) &amp;lt;&amp;gt; 0 &lt;span class='kw'&gt;Then    
                Msgbox Join&lt;/span&gt;(res, vbCrLf), vbCritical, &lt;span class='str'&gt;"Ошибка в "&lt;/span&gt; &amp;amp; thisScriptName 
            &lt;span class='kw'&gt;End If
        next
        
        set&lt;/span&gt; cb = &lt;span class='kw'&gt;nothing    
    else&lt;/span&gt;
        WScript.Echo &lt;span class='str'&gt;"Формат вызова: "&lt;/span&gt; &amp;amp; thisScriptName &amp;amp; &lt;span class='str'&gt;" "&lt;/span&gt; &amp;amp; &lt;span class='str'&gt;"{имя файла}"&lt;/span&gt;
    &lt;span class='kw'&gt;end if         
end if&lt;/span&gt;
    
&lt;span class='com'&gt;'Данный интерфейс предоставляет callback функцию для FindFile&lt;/span&gt;
class FindFileCallback
    &lt;span class='kw'&gt;Public&lt;/span&gt; skipEmpty
    &lt;span class='kw'&gt;Private&lt;/span&gt; fso
    &lt;span class='kw'&gt;Private&lt;/span&gt; table
    &lt;span class='kw'&gt;Private&lt;/span&gt; filesCount
    &lt;span class='kw'&gt;Private&lt;/span&gt; linesTotal

    &lt;span class='kw'&gt;Private Sub&lt;/span&gt; Class_Initialize() 
        skipEmpty = 0
        linesTotal = 0
        &lt;span class='kw'&gt;set&lt;/span&gt; fso = &lt;span class='kw'&gt;CreateObject&lt;/span&gt;(&lt;span class='str'&gt;"Scripting.FileSystemObject"&lt;/span&gt;)
        
        &lt;span class='kw'&gt;set&lt;/span&gt; table = &lt;span class='kw'&gt;new&lt;/span&gt; TableBuilder
        table.ColumnsCount = 4

        table.AddCell &lt;span class='str'&gt;"Номер"&lt;/span&gt;
        table.AddCell &lt;span class='str'&gt;"Имя"&lt;/span&gt;
        table.AddCell &lt;span class='str'&gt;"Папка"&lt;/span&gt;
        table.AddCell &lt;span class='str'&gt;"Количество строк"&lt;/span&gt;                
    &lt;span class='kw'&gt;End Sub

    Private Sub&lt;/span&gt; Class_Terminate()        
        table.AddCell &lt;span class='str'&gt;"Всего строк"&lt;/span&gt;
        table.AddCell linesTotal
                            
        &lt;span class='kw'&gt;set&lt;/span&gt; fso = &lt;span class='kw'&gt;Nothing
        set&lt;/span&gt; table = &lt;span class='kw'&gt;Nothing
    End Sub&lt;/span&gt;

    &lt;span class='com'&gt;'Данная функция будет вызываться в процессе работы FindFile::Find() для каждого найденного файла&lt;/span&gt;
    &lt;span class='kw'&gt;Public Function&lt;/span&gt; Found(fname)
        &lt;span class='kw'&gt;On Error resume next&lt;/span&gt;
        
        filesCount = filesCount + 1

        &lt;span class='kw'&gt;Dim&lt;/span&gt; fp
        &lt;span class='kw'&gt;set&lt;/span&gt; fp = fso.OpenTextFile(fname, ForReading, &lt;span class='kw'&gt;False&lt;/span&gt;)
    
        &lt;span class='kw'&gt;Dim&lt;/span&gt; s
        &lt;span class='kw'&gt;DIm&lt;/span&gt; linesCounter
        &lt;span class='kw'&gt;do while not&lt;/span&gt; (fp.&lt;span class='kw'&gt;atEndOfStream&lt;/span&gt;)
            s = fp.ReadLine
            &lt;span class='kw'&gt;if&lt;/span&gt; (&lt;span class='kw'&gt;not CBool&lt;/span&gt;(skipEmpty)) &lt;span class='kw'&gt;or&lt;/span&gt; (&lt;span class='kw'&gt;CBool&lt;/span&gt;(skipEmpty) &lt;span class='kw'&gt;and Trim&lt;/span&gt;(s) &amp;lt;&amp;gt; &lt;span class='str'&gt;""&lt;/span&gt;) &lt;span class='kw'&gt;then&lt;/span&gt; 
                linesCounter = linesCounter + 1
            &lt;span class='kw'&gt;end if                
        loop&lt;/span&gt;
        
        fp.&lt;span class='kw'&gt;Close&lt;/span&gt;
         
        table.AddCell filesCount  
        table.AddCell &lt;span class='str'&gt;"&amp;lt;a href = """&lt;/span&gt; &amp;amp; fname &amp;amp; &lt;span class='str'&gt;"""&amp;gt; "&lt;/span&gt; &amp;amp; fso.GetFileName(fname) &amp;amp; &lt;span class='str'&gt;"&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;"&lt;/span&gt;        

        &lt;span class='kw'&gt;Dim&lt;/span&gt; dir
        dir = fso.GetParentFolderName(fname)         
        table.AddCell &lt;span class='str'&gt;"&amp;lt;a href = """&lt;/span&gt; &amp;amp; dir &amp;amp; &lt;span class='str'&gt;"""&amp;gt; "&lt;/span&gt; &amp;amp; dir &amp;amp; &lt;span class='str'&gt;"&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;"&lt;/span&gt;

        table.AddCell linesCounter            

        linesTotal = linesTotal + linesCounter
                            
        &lt;span class='kw'&gt;if Err&lt;/span&gt;.Number = 0 &lt;span class='kw'&gt;then&lt;/span&gt;
            Found = &lt;span class='kw'&gt;Array&lt;/span&gt;(0, &lt;span class='str'&gt;""&lt;/span&gt;, &lt;span class='str'&gt;""&lt;/span&gt;)
        &lt;span class='kw'&gt;else&lt;/span&gt;
            Found = &lt;span class='kw'&gt;Array&lt;/span&gt;(&lt;span class='kw'&gt;Err&lt;/span&gt;.Number, &lt;span class='kw'&gt;Err&lt;/span&gt;.Source, &lt;span class='kw'&gt;Err&lt;/span&gt;.&lt;span class='kw'&gt;Description&lt;/span&gt;)
            &lt;span class='kw'&gt;Err&lt;/span&gt;.&lt;span class='kw'&gt;Clear
        end if                                       
    end function    
end&lt;/span&gt; class

class TableBuilder
    &lt;span class='kw'&gt;Private&lt;/span&gt; oIE
    &lt;span class='kw'&gt;Private&lt;/span&gt; doc
    &lt;span class='kw'&gt;Private&lt;/span&gt; nCols
    &lt;span class='kw'&gt;Private&lt;/span&gt; iCol

    &lt;span class='kw'&gt;Private Sub&lt;/span&gt; Class_Initialize() 
        &lt;span class='kw'&gt;Set&lt;/span&gt; oIE = &lt;span class='kw'&gt;CreateObject&lt;/span&gt;(&lt;span class='str'&gt;"InternetExplorer.Application"&lt;/span&gt;)                 
        
        oIE.Navigate &lt;span class='str'&gt;"about:blank"&lt;/span&gt;   
        oIE.Visible = 1 

        &lt;span class='kw'&gt;Do While&lt;/span&gt; (oIE.Busy)
            WScript.Sleep 200
        &lt;span class='kw'&gt;Loop

        Set&lt;/span&gt; doc = oIE.Document
        doc.&lt;span class='kw'&gt;open&lt;/span&gt;
        doc.WriteLn &lt;span class='str'&gt;"&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;"&lt;/span&gt; 
        doc.WriteLn &lt;span class='str'&gt;"&amp;lt;body&amp;gt;"&lt;/span&gt;
        
        doc.WriteLn &lt;span class='str'&gt;"&amp;lt;table align = left border = 0 cellspacing = 10&amp;gt;"&lt;/span&gt;
        
        nCols = 1
    &lt;span class='kw'&gt;End Sub

    Private Sub&lt;/span&gt; Class_Terminate()        
        doc.WriteLn &lt;span class='str'&gt;"&amp;lt;/table&amp;gt;"&lt;/span&gt;
        doc.WriteLn &lt;span class='str'&gt;"&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"&lt;/span&gt;
        doc.&lt;span class='kw'&gt;Close
        set&lt;/span&gt; oIE = &lt;span class='kw'&gt;nothing
    End Sub
        
    Public property Let&lt;/span&gt; ColumnsCount(val)
        &lt;span class='kw'&gt;if&lt;/span&gt; val &amp;gt; 0 &lt;span class='kw'&gt;then&lt;/span&gt;
            nCols = val
        &lt;span class='kw'&gt;else&lt;/span&gt;
            nCols = 1
        &lt;span class='kw'&gt;end if                 
    end property
    
    Public Sub&lt;/span&gt; AddCell(cellBody)
        &lt;span class='kw'&gt;if&lt;/span&gt; iCol = 0 &lt;span class='kw'&gt;then&lt;/span&gt;
            doc.WriteLn &lt;span class='str'&gt;"&amp;lt;tr&amp;gt;"&lt;/span&gt;
        &lt;span class='kw'&gt;end if&lt;/span&gt;
                        
        doc.WriteLn &lt;span class='str'&gt;"&amp;lt;td&amp;gt;"&lt;/span&gt;
        doc.WriteLn &lt;span class='kw'&gt;CStr&lt;/span&gt;(cellBody)
        doc.WriteLn &lt;span class='str'&gt;"&amp;lt;/td&amp;gt;"&lt;/span&gt;        

        iCol = iCol + 1

        &lt;span class='kw'&gt;if&lt;/span&gt; iCol = nCols &lt;span class='kw'&gt;then&lt;/span&gt;
            doc.WriteLn &lt;span class='str'&gt;"&amp;lt;/tr&amp;gt;"&lt;/span&gt;
            iCol = 0
        &lt;span class='kw'&gt;end if                
    end sub
end&lt;/span&gt; class&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Thu, 03 May 2012 08:37:46 GMT</pubDate>
		
			<author>ST1 &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>1</slash:comments>
		
	</item>

	<item>
		<title>Библиотека реализующая ThreadLocal&lt;T&gt;</title>
		<link>http://rsdn.org/Forum/src/4700239.1</link>
		<guid isPermaLink="true">http://rsdn.org/Forum/src/4700239</guid>
		<comments>http://rsdn.org/Forum/src/4700239</comments>
		<wfw:comment>http://rsdn.org/Forum/PostRssComment.aspx?mid=4700239</wfw:comment>
		<wfw:commentRss>http://rsdn.org/Forum/RSS/4700239</wfw:commentRss>
		<trackback:ping>http://rsdn.org/Forum/Trackback.aspx?mid=4700239</trackback:ping>
		<description>
			
					&lt;div style="@import url(http://rsdn.org/Forum/Forum.css);"&gt;Покритикуйте имплементацию обёртки для thread local объектов:&lt;br /&gt;
+ tls а не эмулятор, со всеми вытекающими&lt;br /&gt;
+ простая имплементация&lt;br /&gt;
+ проблем мало, и они декларированны&lt;br /&gt;
+ работает &lt;img border='0' width='15' height='15' src='//rsdn.org/Forum/images/sup.gif' /&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;								ThreadLocal.h			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"windows.h"&lt;/span&gt;
&lt;span class='kw'&gt;class&lt;/span&gt; ThreadLocalBase
{
&lt;span class='kw'&gt;public&lt;/span&gt;:
    &lt;span class='kw'&gt;virtual void&lt;/span&gt; DestructThreadLocalInstance() = 0;
    &lt;span class='kw'&gt;void&lt;/span&gt; * GetValue()
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; TlsGetValue(GetIndex());
    }
    &lt;span class='kw'&gt;void&lt;/span&gt; SetValue(&lt;span class='kw'&gt;void&lt;/span&gt; * val)
    {
        TlsSetValue(GetIndex(), val);
    }
    DWORD GetIndex()
    {
        &lt;span class='kw'&gt;return&lt;/span&gt; m_tlsIndex;
    }
&lt;span class='kw'&gt;protected&lt;/span&gt;:
    DWORD m_tlsIndex;
    ~ThreadLocalBase(){}
};

DWORD AddAtThreadExit(ThreadLocalBase *);
&lt;span class='kw'&gt;void&lt;/span&gt; RemoveAtThreadExit(ThreadLocalBase *);

&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;class&lt;/span&gt; ThreadLocal : &lt;span class='kw'&gt;protected&lt;/span&gt; ThreadLocalBase
{
&lt;span class='kw'&gt;public&lt;/span&gt;:
    ThreadLocal()
    {
        m_tlsIndex = AddAtThreadExit(&lt;span class='kw'&gt;this&lt;/span&gt;);
    }    
    ~ThreadLocal()
    {
                ThreadLocal::DestructThreadLocalInstance();
        RemoveAtThreadExit(&lt;span class='kw'&gt;this&lt;/span&gt;);
    }    
    T * &lt;span class='kw'&gt;operator&lt;/span&gt;-&amp;gt;()
    {        
        &lt;span class='kw'&gt;return&lt;/span&gt; &amp;amp;(**&lt;span class='kw'&gt;this&lt;/span&gt;);
    }
    T&amp;amp; &lt;span class='kw'&gt;operator&lt;/span&gt;*()
    {
        T *  val = (T*)GetValue();
        &lt;span class='kw'&gt;if&lt;/span&gt; (!val) 
        {
            val = &lt;span class='kw'&gt;new&lt;/span&gt; T();
            SetValue(val);
        }
        &lt;span class='kw'&gt;return&lt;/span&gt; *val;
    }
&lt;span class='kw'&gt;private&lt;/span&gt;:
    &lt;span class='kw'&gt;virtual void&lt;/span&gt; DestructThreadLocalInstance() override
    {
        &lt;span class='kw'&gt;void&lt;/span&gt; * val = GetValue();
        &lt;span class='kw'&gt;if&lt;/span&gt; (val)
        {
            &lt;span class='kw'&gt;delete&lt;/span&gt; (T*)val;
            SetValue((&lt;span class='kw'&gt;void&lt;/span&gt;*)0);
        }
    }
};&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;								ThreadLocal.cpp			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;&lt;span class='kw'&gt;#include&lt;/span&gt; &lt;span class='str'&gt;"ThreadAtExit.h"&lt;/span&gt;
&lt;span class='kw'&gt;#include&lt;/span&gt; &amp;lt;set&amp;gt;

&lt;span class='kw'&gt;volatile long&lt;/span&gt; mutex = 0;
&lt;span class='kw'&gt;struct&lt;/span&gt; lock
{
    lock() { &lt;span class='kw'&gt;while&lt;/span&gt; (InterlockedExchange(&amp;amp;mutex, 1) == 1) SwitchToThread();}
    ~lock() { InterlockedExchange(&amp;amp;mutex, 0);}
};
std::set&amp;lt;ThreadLocalBase *&amp;gt; AtExitSet;
DWORD AddAtThreadExit(ThreadLocalBase * tlb)
{
    lock _;
    AtExitSet.insert(tlb);
    &lt;span class='kw'&gt;return&lt;/span&gt; TlsAlloc();
}
&lt;span class='kw'&gt;void&lt;/span&gt; RemoveAtThreadExit(ThreadLocalBase * tlb)
{
    lock _;
    AtExitSet.erase(tlb);
    TlsFree(tlb-&amp;gt;GetIndex());
}
&lt;span class='kw'&gt;void&lt;/span&gt; DestructThreadLocals()
{
    lock _;
    &lt;span class='kw'&gt;for&lt;/span&gt;(std::set&amp;lt;ThreadLocalBase *&amp;gt;::iterator it = AtExitSet.begin(), it_end =  AtExitSet.end();
        it != it_end;
        ++it)
    {
        (*it)-&amp;gt;DestructThreadLocalInstance();
    }
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    &lt;span class='kw'&gt;switch&lt;/span&gt; (ul_reason_for_call)
    {
    &lt;span class='kw'&gt;case&lt;/span&gt; DLL_PROCESS_ATTACH:
    &lt;span class='kw'&gt;case&lt;/span&gt; DLL_THREAD_ATTACH:
        &lt;span class='kw'&gt;break&lt;/span&gt;;
    &lt;span class='kw'&gt;case&lt;/span&gt; DLL_THREAD_DETACH:
        DestructThreadLocals();
        &lt;span class='kw'&gt;break&lt;/span&gt;;
    &lt;span class='kw'&gt;case&lt;/span&gt; DLL_PROCESS_DETACH:
        &lt;span class='kw'&gt;break&lt;/span&gt;;
    }
    &lt;span class='kw'&gt;return&lt;/span&gt; TRUE;
}&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;								ThreadLocal.def			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; 	&lt;tbody style="display:none"&gt; 		&lt;tr&gt;			&lt;td style="background-image:url(//rsdn.org/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;pre class='c'&gt;&lt;code&gt;LIBRARY   ThreadLocal
EXPORTS
   AddAtThreadExit   @1
   RemoveAtThreadExit   @2&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt; 		&lt;/tr&gt; 		&lt;tr&gt;			&lt;td style="height:1px;background-image:url(//rsdn.org/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;i&gt;на коленке&lt;/i&gt; и доведённая до &lt;i&gt;состояния стояния&lt;/i&gt; идея, решающая возможно основную, но относительно узкую задачу.&lt;br /&gt;
Соответственно, самодельный спин мютекс логично заменить чем-то принятым на месте работы, а имена функций, классов и переменных подогнать под местные конвенции.&lt;br /&gt;
&lt;br /&gt;
О недостатках:&lt;br /&gt;
1. Не достаточно настраевоемо&lt;br /&gt;
2. Windows specific&lt;br /&gt;
3. Требует дополнительный Dll&lt;br /&gt;
4. Не работает с Delay Load (в деструкторе вызывается экспортируемая функция)&lt;br /&gt;
5. Выгрузка бинарника со статиком приводит к потере объекта для каждого из построивших себе инстанс оставшихся потоков.&lt;br /&gt;
&lt;br /&gt;
Моё мнение об этих недостатках:&lt;br /&gt;
1. можно расширить по мере надобности &lt;img border='0' width='37' height='15' src='//rsdn.org/Forum/images/xz.gif' /&gt; &lt;br /&gt;
2. увы &lt;img border='0' width='15' height='20' src='//rsdn.org/Forum/images/shuffle.gif' /&gt; (если идея ясна, то не сложно переписать на pthread) &lt;br /&gt;
3. в большинстве случаев не проблема &lt;img border='0' width='40' height='20' src='//rsdn.org/Forum/images/user.gif' /&gt; &lt;br /&gt;
4. По большому счёту, нет такой нужды &lt;img border='0' width='37' height='15' src='//rsdn.org/Forum/images/xz.gif' /&gt; &lt;br /&gt;
5. В подавляющем большинстве случаев магии выгрузки библиотек нет, и проблем с этим связанных решать не надо. &lt;img border='0' width='40' height='20' src='//rsdn.org/Forum/images/user.gif' /&gt;&lt;/div&gt;
				
		</description>
		
		<category>src</category>
		<pubDate>Fri, 13 Apr 2012 00:24:31 GMT</pubDate>
		
			<author>Caracrist &lt;forum@rsdn.org&gt;</author>
		
		
			<slash:comments>5</slash:comments>
		
	</item>
</channel>
</rss>
