Restored the develplayground. Formerly named 'test' now
[platform/upstream/libzypp.git] / devel / genclass.in
1 #! /bin/bash
2
3 function usage() {
4    echo $@ >&2
5    echo <<EOF >&2
6 Usage: genclass [path/]stem
7 EOF
8    exit 1
9 }
10
11 test -z "$1" && usage "Missing name!"
12
13 TOPSRCDIR=$( cd @abs_top_srcdir@ && pwd )
14 test -z "$TOPSRCDIR" && {
15    echo "Dir does not exist '@abs_top_srcdir@'" >&2
16    exit 1
17 }
18
19 OUTDIR=$(dirname $1)
20 STEM=$(basename $1)
21 STEMDIR=$( cd $OUTDIR && pwd )
22 test -z "$STEMDIR" && {
23    echo "Dir does not exist '$(dirname $1)'" >&2
24    exit 1
25 }
26 STEMDIR=${STEMDIR#$TOPSRCDIR/}
27
28 CLASS=$STEM
29 CLASS_H=$STEMDIR/$STEM.h
30 CLASS_CC=$STEMDIR/$STEM.cc
31
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"
39 }
40
41 INCLUDE_H=$CLASS_H
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}')
44 SNLIST=
45 INDENT=
46 for N in $NSLIST; do
47    SNLIST="$N $SNLIST"
48    INDENT="$INDENT  "
49 done
50
51 ######################################################################
52 function intro() {
53 ######################################################################
54    local FILE=$1
55 cat <<EOF
56 /*---------------------------------------------------------------------\\
57 |                          ____ _   __ __ ___                          |
58 |                         |__  / \ / / . \ . \                         |
59 |                           / / \ V /|  _/  _/                         |
60 |                          / /__ | | | | | |                           |
61 |                         /_____||_| |_| |_|                           |
62 |                                                                      |
63 \---------------------------------------------------------------------*/
64 /** \file       ${FILE}
65  *
66 */
67 EOF
68 }
69
70 ######################################################################
71 function nsopen() {
72 ######################################################################
73    local I=
74    for N in $NSLIST; do
75       echo "${I}///////////////////////////////////////////////////////////////////"
76       echo "${I}namespace $N"
77       echo "${I}{ /////////////////////////////////////////////////////////////////"
78       I="$I  "
79    done
80 }
81
82 ######################################################################
83 function nsclose() {
84 ######################################################################
85    local I=${INDENT}
86    for N in $SNLIST; do
87       echo "${I}/////////////////////////////////////////////////////////////////"
88       I=${I#  }
89       echo "${I}} // namespace $N"
90       echo "${I}///////////////////////////////////////////////////////////////////"
91    done
92 }
93
94 ######################################################################
95 function genH() {
96 ######################################################################
97 cat <<EOF
98 $(intro $CLASS_H)
99 #ifndef $INCLUDE_DEF
100 #define $INCLUDE_DEF
101
102 #include <iosfwd>
103
104 #include "zypp/base/PtrTypes.h"
105
106 $(nsopen)
107 ${INDENT}///////////////////////////////////////////////////////////////////
108 ${INDENT}namespace detail
109 ${INDENT}{ /////////////////////////////////////////////////////////////////
110 ${INDENT}  DEFINE_PTR_TYPE(${CLASS}Impl)
111 ${INDENT}  /////////////////////////////////////////////////////////////////
112 ${INDENT}} // namespace detail
113 ${INDENT}///////////////////////////////////////////////////////////////////
114
115 ${INDENT}///////////////////////////////////////////////////////////////////
116 ${INDENT}//
117 ${INDENT}//     CLASS NAME : ${CLASS}
118 ${INDENT}//
119 ${INDENT}/** */
120 ${INDENT}class ${CLASS}
121 ${INDENT}{
122 ${INDENT}public:
123 ${INDENT}  /** Default ctor */
124 ${INDENT}  ${CLASS}();
125 ${INDENT}  /** Factory ctor */
126 ${INDENT}  explicit
127 ${INDENT}  ${CLASS}( detail::${CLASS}ImplPtr impl_r );
128 ${INDENT}  /** Dtor */
129 ${INDENT}  ~${CLASS}();
130
131 ${INDENT}private:
132 ${INDENT}  /** Pointer to implementation */
133 ${INDENT}  detail::${CLASS}ImplPtr _pimpl;
134 ${INDENT}public:
135 ${INDENT}  /** Avoid a bunch of friend decl. */
136 ${INDENT}  detail::const${CLASS}ImplPtr sayFriend() const;
137 ${INDENT}};
138 ${INDENT}///////////////////////////////////////////////////////////////////
139
140 ${INDENT}/** \relates ${CLASS} Stream output */
141 ${INDENT}extern std::ostream & operator<<( std::ostream & str, const ${CLASS} & obj );
142
143 $(nsclose)
144 #endif // $INCLUDE_DEF
145 EOF
146 }
147
148 ######################################################################
149 function genCC() {
150 ######################################################################
151 cat <<EOF
152 $(intro $CLASS_CC)
153 #include <iostream>
154
155 #include "zypp/base/ReferenceCounted.h"
156 #include "zypp/base/NonCopyable.h"
157 #include "${INCLUDE_H}"
158
159 using namespace std;
160
161 $(nsopen)
162
163 ${INDENT}///////////////////////////////////////////////////////////////////
164 ${INDENT}namespace detail
165 ${INDENT}{ /////////////////////////////////////////////////////////////////
166
167 ${INDENT}  ///////////////////////////////////////////////////////////////////
168 ${INDENT}  //
169 ${INDENT}  //   CLASS NAME : ${CLASS}Impl
170 ${INDENT}  //
171 ${INDENT}  /** ${CLASS} implementation */
172 ${INDENT}  struct ${CLASS}Impl : public base::ReferenceCounted, private base::NonCopyable
173 ${INDENT}  {
174 ${INDENT}    /** Default ctor*/
175 ${INDENT}    ${CLASS}Impl();
176 ${INDENT}    /** Dtor */
177 ${INDENT}    ~${CLASS}Impl();
178 ${INDENT}  };
179 ${INDENT}  ///////////////////////////////////////////////////////////////////
180 ${INDENT}  IMPL_PTR_TYPE(${CLASS}Impl)
181 ${INDENT}  ///////////////////////////////////////////////////////////////////
182
183 ${INDENT}  /** \relates ${CLASS}Impl Stream output */
184 ${INDENT}  inline std::ostream & operator<<( std::ostream & str, const ${CLASS}Impl & obj )
185 ${INDENT}  {
186 ${INDENT}    return str << "${CLASS}Impl";
187 ${INDENT}  }
188
189 ${INDENT}  /////////////////////////////////////////////////////////////////
190 ${INDENT}} // namespace detail
191 ${INDENT}///////////////////////////////////////////////////////////////////
192
193 ${INDENT}///////////////////////////////////////////////////////////////////
194 ${INDENT}//
195 ${INDENT}//     CLASS NAME : ${CLASS}
196 ${INDENT}//
197 ${INDENT}///////////////////////////////////////////////////////////////////
198
199 ${INDENT}///////////////////////////////////////////////////////////////////
200 ${INDENT}//
201 ${INDENT}//     METHOD NAME : ${CLASS}::${CLASS}
202 ${INDENT}//     METHOD TYPE : Ctor
203 ${INDENT}//
204 ${INDENT}${CLASS}::${CLASS}()
205 ${INDENT}{}
206
207 ${INDENT}///////////////////////////////////////////////////////////////////
208 ${INDENT}//
209 ${INDENT}//     METHOD NAME : ${CLASS}::${CLASS}
210 ${INDENT}//     METHOD TYPE : Ctor
211 ${INDENT}//
212 ${INDENT}${CLASS}::${CLASS}( detail::${CLASS}ImplPtr impl_r )
213 ${INDENT}: _pimpl( impl_r )
214 ${INDENT}{}
215
216 ${INDENT}///////////////////////////////////////////////////////////////////
217 ${INDENT}//
218 ${INDENT}//     METHOD NAME : ${CLASS}::~${CLASS}
219 ${INDENT}//     METHOD TYPE : Dtor
220 ${INDENT}//
221 ${INDENT}${CLASS}::~${CLASS}()
222 ${INDENT}{}
223
224 ${INDENT}///////////////////////////////////////////////////////////////////
225 ${INDENT}//
226 ${INDENT}//     METHOD NAME : ${CLASS}::sayFriend
227 ${INDENT}//     METHOD TYPE : detail::const${CLASS}ImplPtr
228 ${INDENT}//
229 ${INDENT}detail::const${CLASS}ImplPtr ${CLASS}::sayFriend() const
230 ${INDENT}{ return _pimpl; }
231
232 ${INDENT}/******************************************************************
233 ${INDENT}**
234 ${INDENT}**     FUNCTION NAME : operator<<
235 ${INDENT}**     FUNCTION TYPE : std::ostream &
236 ${INDENT}*/
237 ${INDENT}std::ostream & operator<<( std::ostream & str, const ${CLASS} & obj )
238 ${INDENT}{
239 ${INDENT}  return str << *obj.sayFriend();
240 ${INDENT}}
241
242 $(nsclose)
243 EOF
244 }
245
246 ######################################################################
247 ######################################################################
248 ######################################################################
249
250 genH >$OUT_CLASS_H
251 genCC >$OUT_CLASS_CC