00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00028 
00029 #ifndef OggDebug
00030 #define OggDebug
00031 
00032 #ifdef __GNUG__
00033 #pragma interface
00034 #endif
00035 
00036 #include        <iostream>
00037 
00038 extern  "C"
00039 {
00040 #include        <pthread.h>
00041 }
00042 
00043 
00044 namespace       Ogg
00045 {
00046   using std::ostream;
00047     
00048   class Debug
00049   {
00050   private:
00051     pthread_mutexattr_t lockType;
00052     pthread_mutex_t     lock;
00053 
00054   public:
00055     Debug() throw()
00056     {
00057       pthread_mutexattr_init(&lockType);
00058       
00059       pthread_mutexattr_settype(&lockType, PTHREAD_MUTEX_RECURSIVE);
00060       pthread_mutex_init(&lock, &lockType);
00061     }
00062 
00063     virtual
00064     ~Debug() throw ()
00065     {}
00066 
00067     void
00068     init()
00069     {
00070       pthread_mutexattr_init(&lockType);
00071       pthread_mutexattr_settype(&lockType, PTHREAD_MUTEX_RECURSIVE);
00072       pthread_mutex_init(&lock, &lockType);
00073     }
00074 
00075     void
00076     begin()
00077     {
00078       pthread_mutex_lock(&lock);
00079       std::cerr << std::endl << "[";
00080     }
00081 
00082     void
00083     end()
00084     {
00085       std::cerr << "]" << std::endl;
00086       pthread_mutex_unlock(&lock);
00087     }
00088   }
00089   ;
00090 
00091   extern Debug  Dbg;
00092 
00093   inline
00094   Debug& operator<<(ostream & os, Debug & dbg)
00095   {
00096     dbg.end();
00097     return(dbg);
00098   }
00099 
00100   inline
00101   ostream& operator<<(Debug & dbg, ostream & os)
00102   {
00103     dbg.begin();
00104     return(os);
00105   }
00106 
00107   inline void debug()
00108   {
00109     Dbg.init();
00110   }
00111 
00112   inline void debug(bool test)
00113   {
00114     if ( _GEN_DEBUG_CODE && test )
00115       ;
00116   }
00117 
00118   template<class X>
00119   inline void debug(bool test
00120                     ,const X & x
00121                     )
00122   {
00123     if ( _GEN_DEBUG_CODE && test )
00124       {
00125         Dbg << std::cerr
00126             << x
00127             << Dbg;
00128       }
00129   }
00130 
00131   template<class X1
00132            , class X2
00133            >
00134   inline void debug(bool test
00135                     ,const X1 & x1
00136                     ,const X2 & x2
00137                     )
00138   {
00139     if ( _GEN_DEBUG_CODE && test )
00140       {
00141         Dbg << std::cerr
00142           << x1
00143           << x2
00144           << Dbg;
00145       }
00146   }
00147 
00148   template<class X1
00149            , class X2
00150            , class X3
00151            >
00152   inline void debug(bool test
00153                     ,const X1 & x1
00154                     ,const X2 & x2
00155                     ,const X3 & x3
00156                     )
00157   {
00158     if ( _GEN_DEBUG_CODE && test )
00159       {
00160         Dbg << std::cerr
00161           << x1
00162           << x2
00163           << x3
00164           << Dbg;
00165       }
00166   }
00167 
00168   template<class X1
00169            , class X2
00170            , class X3
00171            , class X4
00172            >
00173   inline void debug(bool test
00174                     ,const X1 & x1
00175                     ,const X2 & x2
00176                     ,const X3 & x3
00177                     ,const X4 & x4
00178                     )
00179   {
00180     if ( _GEN_DEBUG_CODE && test )
00181       {
00182         Dbg << std::cerr
00183             << x1
00184             << x2
00185             << x3
00186             << x4
00187             << Dbg;
00188       }
00189   }
00190 
00191   template<class X1
00192            , class X2
00193            , class X3
00194            , class X4
00195            , class X5
00196            >
00197   inline void debug(bool test
00198                     ,const X1 & x1
00199                     ,const X2 & x2
00200                     ,const X3 & x3
00201                     ,const X4 & x4
00202                     ,const X5 & x5
00203                     )
00204   {
00205     if ( _GEN_DEBUG_CODE && test )
00206       {
00207         Dbg << std::cerr
00208             << x1
00209             << x2
00210             << x3
00211             << x4
00212             << x5
00213             << Dbg;
00214       }
00215   }
00216 
00217   template<class X1
00218            , class X2
00219            , class X3
00220            , class X4
00221            , class X5
00222            , class X6
00223            >
00224   inline void debug(bool test
00225                     ,const X1 & x1
00226                     ,const X2 & x2
00227                     ,const X3 & x3
00228                     ,const X4 & x4
00229                     ,const X5 & x5
00230                     ,const X6 & x6
00231                     )
00232   {
00233     if ( _GEN_DEBUG_CODE && test )
00234       {
00235         Dbg << std::cerr
00236             << x1
00237             << x2
00238             << x3
00239             << x4
00240             << x5
00241             << x6
00242             << Dbg;
00243       }
00244   }
00245 
00246   template<class X1
00247            , class X2
00248            , class X3
00249            , class X4
00250            , class X5
00251            , class X6
00252            , class X7
00253            >
00254   inline void debug(bool test
00255                     ,const X1 & x1
00256                     ,const X2 & x2
00257                     ,const X3 & x3
00258                     ,const X4 & x4
00259                     ,const X5 & x5
00260                     ,const X6 & x6
00261                     ,const X7 & x7
00262                     )
00263   {
00264     if ( _GEN_DEBUG_CODE && test )
00265       {
00266         Dbg
00267           <<std::cerr
00268           << x1
00269           << x2
00270           << x3
00271           << x4
00272           << x5
00273           << x6
00274           << x7
00275           << Dbg;
00276       }
00277   }
00278 
00279   template<class X1
00280            , class X2
00281            , class X3
00282            , class X4
00283            , class X5
00284            , class X6
00285            , class X7
00286            , class X8
00287            >
00288   inline void debug(bool test
00289                     ,const X1 & x1
00290                     ,const X2 & x2
00291                     ,const X3 & x3
00292                     ,const X4 & x4
00293                     ,const X5 & x5
00294                     ,const X6 & x6
00295                     ,const X7 & x7
00296                     ,const X8 & x8
00297                     )
00298   {
00299     if ( _GEN_DEBUG_CODE && test )
00300       {
00301         Dbg
00302           <<std::cerr
00303           << x1
00304           << x2
00305           << x3
00306           << x4
00307           << x5
00308           << x6
00309           << x7
00310           << x8
00311           << Dbg;
00312       }
00313   }
00314 
00315   template<class X1
00316            , class X2
00317            , class X3
00318            , class X4
00319            , class X5
00320            , class X6
00321            , class X7
00322            , class X8
00323            , class X9
00324            >
00325   inline void debug(bool test
00326                     ,const X1 & x1
00327                     ,const X2 & x2
00328                     ,const X3 & x3
00329                     ,const X4 & x4
00330                     ,const X5 & x5
00331                     ,const X6 & x6
00332                     ,const X7 & x7
00333                     ,const X8 & x8
00334                     ,const X9 & x9
00335                     )
00336   {
00337     if ( _GEN_DEBUG_CODE && test )
00338       {
00339         Dbg
00340           <<std::cerr
00341           << x1
00342           << x2
00343           << x3
00344           << x4
00345           << x5
00346           << x6
00347           << x7
00348           << x8
00349           << x9
00350           << Dbg;
00351       }
00352   }
00353 
00354   template<class X1
00355            , class X2
00356            , class X3
00357            , class X4
00358            , class X5
00359            , class X6
00360            , class X7
00361            , class X8
00362            , class X9
00363            , class X10
00364            >
00365   inline void debug(bool test
00366                     ,const X1 & x1
00367                     ,const X2 & x2
00368                     ,const X3 & x3
00369                     ,const X4 & x4
00370                     ,const X5 & x5
00371                     ,const X6 & x6
00372                     ,const X7 & x7
00373                     ,const X8 & x8
00374                     ,const X9 & x9
00375                     ,const X10 & x10
00376                     )
00377   {
00378     if ( _GEN_DEBUG_CODE && test )
00379       {
00380         Dbg
00381           <<std::cerr
00382           << x1
00383           << x2
00384           << x3
00385           << x4
00386           << x5
00387           << x6
00388           << x7
00389           << x8
00390           << x9
00391           << x10
00392           << Dbg;
00393       }
00394   }
00395 
00396   template<class X1
00397            , class X2
00398            , class X3
00399            , class X4
00400            , class X5
00401            , class X6
00402            , class X7
00403            , class X8
00404            , class X9
00405            , class X10
00406            , class X11
00407            >
00408   inline void debug(bool test
00409                     ,const X1 & x1
00410                     ,const X2 & x2
00411                     ,const X3 & x3
00412                     ,const X4 & x4
00413                     ,const X5 & x5
00414                     ,const X6 & x6
00415                     ,const X7 & x7
00416                     ,const X8 & x8
00417                     ,const X9 & x9
00418                     ,const X10 & x10
00419                     ,const X11 & x11
00420                     )
00421   {
00422     if ( _GEN_DEBUG_CODE && test )
00423       {
00424         Dbg
00425           <<std::cerr
00426           << x1
00427           << x2
00428           << x3
00429           << x4
00430           << x5
00431           << x6
00432           << x7
00433           << x8
00434           << x9
00435           << x10
00436           << x11
00437           << Dbg;
00438       }
00439   }
00440 
00441 }
00442 
00443 #endif