6 Usage: genclass [path/]stem
11 test -z "$1" && usage "Missing name!"
13 TOPSRCDIR=$( cd @abs_top_srcdir@ && pwd )
14 test -z "$TOPSRCDIR" && {
15 echo "Dir does not exist '@abs_top_srcdir@'" >&2
21 STEMDIR=$( cd $OUTDIR && pwd )
22 test -z "$STEMDIR" && {
23 echo "Dir does not exist '$(dirname $1)'" >&2
26 STEMDIR=${STEMDIR#$TOPSRCDIR/}
29 CLASS_H=$STEMDIR/$STEM.h
30 CLASS_CC=$STEMDIR/$STEM.cc
32 OUT_CLASS_H=$OUTDIR/$STEM.h
33 OUT_CLASS_CC=$OUTDIR/$STEM.cc
34 test -e $OUT_CLASS_H -o -e $OUT_CLASS_CC && {
35 test -e $OUT_CLASS_H && echo "File exists '$OUT_CLASS_H' using '$OUT_CLASS_H.new'" >&2
36 test -e $OUT_CLASS_CC && echo "File exists '$OUT_CLASS_CC' using '$OUT_CLASS_CC.new'" >&2
37 OUT_CLASS_H="$OUT_CLASS_H.new"
38 OUT_CLASS_CC="$OUT_CLASS_CC.new"
42 INCLUDE_DEF=$(echo $INCLUDE_H | sed 's/[./]/_/g' | awk '{print toupper($0)}')
43 NSLIST=$(echo $(dirname $INCLUDE_H) | awk '{l=tolower($0);gsub("/"," ",l);print l}')
51 ######################################################################
53 ######################################################################
56 /*---------------------------------------------------------------------\\
58 | |__ / \ / / . \ . \ |
61 | /_____||_| |_| |_| |
63 \---------------------------------------------------------------------*/
70 ######################################################################
72 ######################################################################
75 echo "${I}///////////////////////////////////////////////////////////////////"
76 echo "${I}namespace $N"
77 echo "${I}{ /////////////////////////////////////////////////////////////////"
82 ######################################################################
84 ######################################################################
87 echo "${I}/////////////////////////////////////////////////////////////////"
89 echo "${I}} // namespace $N"
90 echo "${I}///////////////////////////////////////////////////////////////////"
94 ######################################################################
96 ######################################################################
104 #include "zypp/base/PtrTypes.h"
107 ${INDENT}///////////////////////////////////////////////////////////////////
108 ${INDENT}namespace detail
109 ${INDENT}{ /////////////////////////////////////////////////////////////////
110 ${INDENT} DEFINE_PTR_TYPE(${CLASS}Impl)
111 ${INDENT} /////////////////////////////////////////////////////////////////
112 ${INDENT}} // namespace detail
113 ${INDENT}///////////////////////////////////////////////////////////////////
115 ${INDENT}///////////////////////////////////////////////////////////////////
117 ${INDENT}// CLASS NAME : ${CLASS}
120 ${INDENT}class ${CLASS}
123 ${INDENT} /** Default ctor */
124 ${INDENT} ${CLASS}();
125 ${INDENT} /** Factory ctor */
127 ${INDENT} ${CLASS}( detail::${CLASS}ImplPtr impl_r );
128 ${INDENT} /** Dtor */
129 ${INDENT} ~${CLASS}();
132 ${INDENT} /** Pointer to implementation */
133 ${INDENT} detail::${CLASS}ImplPtr _pimpl;
135 ${INDENT} /** Avoid a bunch of friend decl. */
136 ${INDENT} detail::const${CLASS}ImplPtr sayFriend() const;
138 ${INDENT}///////////////////////////////////////////////////////////////////
140 ${INDENT}/** \relates ${CLASS} Stream output */
141 ${INDENT}extern std::ostream & operator<<( std::ostream & str, const ${CLASS} & obj );
144 #endif // $INCLUDE_DEF
148 ######################################################################
150 ######################################################################
155 #include "zypp/base/ReferenceCounted.h"
156 #include "zypp/base/NonCopyable.h"
157 #include "${INCLUDE_H}"
163 ${INDENT}///////////////////////////////////////////////////////////////////
164 ${INDENT}namespace detail
165 ${INDENT}{ /////////////////////////////////////////////////////////////////
167 ${INDENT} ///////////////////////////////////////////////////////////////////
169 ${INDENT} // CLASS NAME : ${CLASS}Impl
171 ${INDENT} /** ${CLASS} implementation */
172 ${INDENT} struct ${CLASS}Impl : public base::ReferenceCounted, private base::NonCopyable
174 ${INDENT} /** Default ctor*/
175 ${INDENT} ${CLASS}Impl();
176 ${INDENT} /** Dtor */
177 ${INDENT} ~${CLASS}Impl();
179 ${INDENT} ///////////////////////////////////////////////////////////////////
180 ${INDENT} IMPL_PTR_TYPE(${CLASS}Impl)
181 ${INDENT} ///////////////////////////////////////////////////////////////////
183 ${INDENT} /** \relates ${CLASS}Impl Stream output */
184 ${INDENT} inline std::ostream & operator<<( std::ostream & str, const ${CLASS}Impl & obj )
186 ${INDENT} return str << "${CLASS}Impl";
189 ${INDENT} /////////////////////////////////////////////////////////////////
190 ${INDENT}} // namespace detail
191 ${INDENT}///////////////////////////////////////////////////////////////////
193 ${INDENT}///////////////////////////////////////////////////////////////////
195 ${INDENT}// CLASS NAME : ${CLASS}
197 ${INDENT}///////////////////////////////////////////////////////////////////
199 ${INDENT}///////////////////////////////////////////////////////////////////
201 ${INDENT}// METHOD NAME : ${CLASS}::${CLASS}
202 ${INDENT}// METHOD TYPE : Ctor
204 ${INDENT}${CLASS}::${CLASS}()
207 ${INDENT}///////////////////////////////////////////////////////////////////
209 ${INDENT}// METHOD NAME : ${CLASS}::${CLASS}
210 ${INDENT}// METHOD TYPE : Ctor
212 ${INDENT}${CLASS}::${CLASS}( detail::${CLASS}ImplPtr impl_r )
213 ${INDENT}: _pimpl( impl_r )
216 ${INDENT}///////////////////////////////////////////////////////////////////
218 ${INDENT}// METHOD NAME : ${CLASS}::~${CLASS}
219 ${INDENT}// METHOD TYPE : Dtor
221 ${INDENT}${CLASS}::~${CLASS}()
224 ${INDENT}///////////////////////////////////////////////////////////////////
226 ${INDENT}// METHOD NAME : ${CLASS}::sayFriend
227 ${INDENT}// METHOD TYPE : detail::const${CLASS}ImplPtr
229 ${INDENT}detail::const${CLASS}ImplPtr ${CLASS}::sayFriend() const
230 ${INDENT}{ return _pimpl; }
232 ${INDENT}/******************************************************************
234 ${INDENT}** FUNCTION NAME : operator<<
235 ${INDENT}** FUNCTION TYPE : std::ostream &
237 ${INDENT}std::ostream & operator<<( std::ostream & str, const ${CLASS} & obj )
239 ${INDENT} return str << *obj.sayFriend();
246 ######################################################################
247 ######################################################################
248 ######################################################################