OSDN Git Service

fix cmake/Macros.cmake
[moflib/moflib.git] / moflib-1.0 / moflib / moflib / mof / stream / TypeStream.hpp
1 #pragma once
2 #include <memory>
3 #include "mof/stream/Cascade.hpp"
4 #include "mof/stream/Cache.hpp"
5 #include "mof/stream/Constant.hpp"
6 #include "mof/stream/Offset.hpp"
7
8 namespace mof
9 {
10     
11     template< typename T , class Cascador = DEFAULT_CASCADOR< T > >
12         class TypeStream
13     {
14         public:
15         TypeStream( )
16         : m_frameNumber( 0 ) , m_cascade( mof::makeCascadeHandler< T , Cascador >() )
17         {}
18         
19
20         TypeStream( const typename Manipulator< T >::Handler& handler )
21         : m_frameNumber( 0 )  , m_cascade( mof::makeCascadeHandler< T , Cascador >() )
22         {
23             m_cascade << handler;
24         }
25         
26         TypeStream( const T& value )
27         : m_frameNumber( 0 )  , m_cascade( mof::makeCascadeHandler< T , Cascador >() )
28         {
29             m_cascade << value;
30         }
31
32         ~TypeStream( )
33         {}
34         
35         TypeStream< T , Cascador >&
36         operator << 
37         (
38             const typename Manipulator< T >::Handler& b 
39         )
40         {
41             m_cascade->add
42             (
43                 makeOffsetHandler< T >( b , -1 * (int)m_frameNumber)
44             );
45             return *this;
46         }
47         
48         TypeStream< T , Cascador >&
49         operator << 
50         (
51             const TypeStream< T , Cascador >& obj 
52         )
53         {
54             //m_cascade->add( obj.m_cascade  );
55             m_cascade->add( makeCacheHandler<T>(makeOffsetHandler< T >( obj.m_cascade , obj.m_frameNumber - m_frameNumber) ) );
56             return *this;
57         }
58
59
60         TypeStream< T , Cascador >&
61         operator << 
62         (
63             const T& b 
64         )
65         {
66             m_cascade->add( mof::makeConstantHandler( b ) );
67             return *this;
68         }
69
70                 T value( ) const
71         {
72             return m_cascade->value( m_frameNumber );
73         }
74
75         typename Manipulator<T>::Handler toManipulator()
76         {
77             return m_cascade;
78         }
79     
80         void update( )
81         {
82             m_frameNumber++;
83         }
84
85         FrameNumber getCurrentFrameNumber() const
86         {
87             return m_frameNumber;
88         }
89
90     private:
91         FrameNumber m_frameNumber;
92         typename Cascade< T , Cascador >::Handler m_cascade;
93         };
94
95 } // namespace mof