OSDN Git Service

オプション -Wextra で warning が出ないよう調整
[gintenlib/gintenlib.git] / gintenlib / assign.hpp
1 #ifndef GINTENLIB_INCLUDED_ASSIGN_HPP_
2 #define GINTENLIB_INCLUDED_ASSIGN_HPP_
3
4 /*
5
6       <gintenlib/assign.hpp>
7
8   assign : コピーされる側の都合を優先する copy アルゴリズム
9
10   宣言:
11     template< typename FwdOutIte, typename InIte >
12     InIte assign( FwdOutIte begin, FwdOutIte end, InIte src );
13
14     template< typename Range, typename InIte >
15     InIte assign( Range& dest, InIte src );
16
17   機能:
18     [ begin, end ) 区間、あるいは区間 dest を、イテレータ src によって初期化します。
19     戻り値は最後に代入した src の次の要素を示すイテレータになります。
20   
21   等価コード:
22     // イテレータ版のみ記述
23     for( FwdOutIte ite = begin; ite != end; ++ite, ++src )
24     {
25       *ite = *src;
26     }
27
28   使用例:
29     int a[10];
30     boost::array<int, 10> b;
31     
32     // a を、boost::counting_iterator を使い 1 〜 10 の値で初期化
33     gintenlib::assign( a, boost::counting_iterator<int>(1) );
34     
35     // b を逆順に a で初期化
36     gintenlib::assign( b.rbegin(), b.rend(), &a[0] );
37     
38     // 表示
39     cout << gintenlib::list_format( a ) << endl;
40     cout << gintenlib::list_format( b ) << endl;
41
42   補足:
43     ・主に固定長のコンテナを初期化をする場面を想定しています。
44     ・可変長のコンテナの場合は、insert_iterator を使って copy した方が効果的です。
45
46 */
47
48 #include <boost/range.hpp>
49
50 namespace gintenlib
51 {
52   // [ begin, end ) 区間を src で初期化
53   template< typename FwdOutIte, typename InIte >
54   inline InIte assign( FwdOutIte begin, FwdOutIte end, InIte src )
55   {
56     while( begin != end ) 
57     {
58       *begin = *src;
59       ++begin; ++src;
60     }
61     return src;
62   }
63   
64   // dest を src で初期化
65   template< typename Range, typename InIte >
66   inline InIte assign( Range& dest, const InIte& src )
67   {
68     return ::gintenlib::assign( boost::begin(dest), boost::end(dest), src );
69   }
70
71 } // namespace gintenlib
72
73 #endif  // #ifndef GINTENLIB_INCLUDED_ASSIGN_HPP_