fork download
  1. #include <iostream>
  2. #include <stddef.h> // ptrdiff_t
  3. #include <type_traits> // std::remove_cv
  4. #include <utility> // std::move
  5. #include <vector> // std::vector
  6.  
  7. typedef ptrdiff_t Size;
  8.  
  9. template< class Type >
  10. auto movable( Type& o )
  11. -> typename std::remove_cv<Type>::type&&
  12. {
  13. typedef typename std::remove_cv<Type>::type NcvType;
  14. return std::move( const_cast<NcvType&>( o ) );
  15. }
  16.  
  17. namespace hare {
  18.  
  19. // A non-copyable array.
  20. template< class Item >
  21. class NcArray
  22. {
  23. private:
  24. NcArray( NcArray const& ); // No such.
  25. NcArray& operator=( NcArray const& ); // No such.
  26.  
  27. std::vector<Item> items_;
  28.  
  29. public:
  30. typedef typename std::vector<Item>::const_iterator Iterator;
  31.  
  32. void append( Item v ) { items_.emplace_back( movable( v ) ); }
  33.  
  34. auto begin() const -> Iterator { return items_.begin(); }
  35. auto end() const -> Iterator { return items_.end(); }
  36.  
  37. NcArray(): items_() {}
  38.  
  39. NcArray( Item const& v )
  40. : items_( v, 1 )
  41. {}
  42.  
  43. NcArray( NcArray&& other )
  44. : items_( move( other.items_ ) )
  45. {}
  46. };
  47.  
  48. template< class Item >
  49. inline auto concat( NcArray<Item> a, Item const v )
  50. -> NcArray<Item>
  51. {
  52. a.append( movable( v ) );
  53. return movable( a );
  54. }
  55.  
  56. } // namespace hare
  57.  
  58. typedef hare::NcArray<int> Array;
  59.  
  60. auto collatz_aux( int const n, Array const a )
  61. -> Array
  62. {
  63. if( n == 1 )
  64. {
  65. return concat( movable( a ), 1 );
  66. }
  67. else if( n % 2 == 0 )
  68. {
  69. return collatz_aux( n / 2, concat( movable( a ), n ) );
  70. }
  71. else
  72. {
  73. return collatz_aux( 3 * n + 1, concat( movable( a ), n ) );
  74. }
  75. }
  76.  
  77. auto collatz( int const n )
  78. -> Array
  79. {
  80. return collatz_aux( n, Array() );
  81. }
  82.  
  83. auto main()
  84. -> int
  85. {
  86. using namespace std;
  87.  
  88. for( int const v : collatz( 5 ) )
  89. {
  90. cout << v << " ";
  91. }
  92. cout << endl;
  93. }
  94.  
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
5 16 8 4 2 1