Reshuffling directories to separate include and sources, part one.
[fail.git] / include / core / awic / signal.cpp
blob6c0407f2d28aa501e1ff1b87e7948abd490fab26
1 #include <ostream>
2 #include <sstream>
3 #include "core/idlast/namespace.h"
4 #include "signal.h"
5 #include "type.h"
6 #include "flags.h"
8 using namespace awful::awic;
9 using namespace std;
11 void awful::awic::GenerateSignalTraits( std::ostream& Out_,
12 const idlast::Class* pClass_,
13 const idlast::Signal* pSig_ )
15 string FullClassName( pClass_->getName() );
16 const idlast::Namespace* pCurrentNS = pClass_->getNamespace();
17 while( pCurrentNS->getParent() )
19 FullClassName = pCurrentNS->getName() + "::" + FullClassName;
20 pCurrentNS = pCurrentNS->getParent();
23 Out_ << '\n';
24 std::stringstream tagstring;
25 tagstring << "class_traits< " << FullClassName << " >::signal_tags::" << pSig_->getName();
26 OutputFlags( Out_, pSig_->getFlags(), tagstring.str() );
28 const idlast::Signal::paramlist_type& params = pSig_->getParamTypes();
30 Out_ << "\ttemplate< class C > struct signal_traits< C,\n"
31 "\t\t" << tagstring.str() << " >\n"
32 "\t{\n"
33 "\t\ttypedef awful::Signal<";
35 idlast::Signal::paramlist_type::const_iterator it;
36 for( it = params.begin(); it != params.end(); ++it )
38 if( it != params.begin() )
39 Out_ << ',';
40 Out_ << ' ';
41 PrintType( Out_, *it );
44 if( !params.empty() )
45 Out_ << ' ';
47 Out_ << "> type;\n"
48 "\t\tstatic const char* Name() { return \"" << pSig_->getName() << "\"; }\n"
49 "\t\tstatic type C::* MemberPointer() { return &C::m_" << pSig_->getName() << "; }\n"
50 "\n"
51 "\t\ttemplate< class CC > struct CallWrapper\n"
52 "\t\t{\n"
53 "\t\t\tstatic bool Call( CC& CallContext_ )\n"
54 "\t\t\t{\n"
55 "\t\t\t\tC& Obj = CallContext_.getObject();\n"
56 "\t\t\t\tCallContext_.numExpectedParams( " << params.size() << " );\n";
58 int paramid = 1;
59 for( it = params.begin(); it != params.end(); ++it )
61 Out_ << "\n\t\t\t\t";
62 PrintType( Out_, *it );
63 Out_ << " param" << paramid << ";\n"
64 "\t\t\t\tif( !CallContext_.template getParam< ";
66 PrintTypeCategory( Out_, *it );
68 Out_ << " >( param" << paramid << " ) ) return false;\n";
70 ++paramid;
73 if( !params.empty() )
74 Out_ << '\n';
76 Out_ << "\t\t\t\tObj." << pSig_->getName() << '(';
78 paramid = 1;
79 for( it = params.begin(); it != params.end(); ++it )
81 if( paramid > 1 )
82 Out_ << ',';
83 Out_ << " param" << paramid;
85 ++paramid;
88 if( !params.empty() )
89 Out_ << ' ';
91 Out_ << ");\n"
92 "\t\t\t\treturn true;\n"
93 "\t\t\t}\n"
94 "\t\t};\n\n"
96 "\t\ttemplate< class CC > struct SlotWrapper : public awful::RefCounted\n"
97 "\t\t{\n"
98 //"\t\t\tSlotWrapper( const CC& CallContext_ ) : m_CallContext( CallContext_ ) {}\n\n"
99 "\t\t\tvoid Call(";
101 paramid = 1;
102 for( it = params.begin(); it != params.end(); ++it )
104 if( paramid > 1 )
105 Out_ << ',';
106 Out_ << ' ';
107 PrintType( Out_, *it );
108 Out_ << " param" << paramid << '_';
110 ++paramid;
113 if( !params.empty() )
114 Out_ << ' ';
116 Out_ << ")\n"
117 "\t\t\t{\n"
118 "\t\t\t\tm_CallContext.prepare();\n";
120 paramid = 1;
121 for( it = params.begin(); it != params.end(); ++it )
123 Out_ << "\t\t\t\tm_CallContext.template addParam< ";
124 PrintTypeCategory( Out_, *it );
125 Out_ << " >( param" << paramid << "_ );\n";
126 ++paramid;
129 Out_ << "\t\t\t\tm_CallContext.call();\n"
130 "\t\t\t}\n\n"
131 "\t\t\tCC m_CallContext;\n"
132 "\t\t};\n"
133 "\t};\n";