00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 #ifndef ACE_TRUNCATE_H
00016 #define ACE_TRUNCATE_H
00017 
00018 #include  "ace/pre.h"
00019 
00020 #include "ace/config-all.h"
00021 
00022 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00023 # pragma once
00024 #endif 
00025 
00026 #include "ace/Global_Macros.h"
00027 #include "ace/If_Then_Else.h"
00028 #include "ace/Numeric_Limits.h"
00029 
00030 #if defined (ACE_LACKS_LONGLONG_T) \
00031     || defined (__BORLANDC__) && __BORLANDC__ < 0x590
00032 # include "ace/Basic_Types.h"
00033 #endif  
00034 
00035 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00036 
00037 namespace ACE_Utils
00038 {
00039 
00040 #if !defined (__BORLANDC__) || __BORLANDC__ >= 0x590
00041 
00042   template<typename T> struct Sign_Check;
00043 
00044   
00045   template<> struct Sign_Check<unsigned char>  { ACE_STATIC_CONSTANT (bool, is_signed = 0); };
00046   template<> struct Sign_Check<unsigned short> { ACE_STATIC_CONSTANT (bool, is_signed = 0); };
00047   template<> struct Sign_Check<unsigned int>   { ACE_STATIC_CONSTANT (bool, is_signed = 0); };
00048   template<> struct Sign_Check<unsigned long>  { ACE_STATIC_CONSTANT (bool, is_signed = 0); };
00049 #ifndef ACE_LACKS_LONGLONG_T
00050 # ifdef __GNUC__
00051   
00052   
00053   __extension__
00054 # endif  
00055   template<> struct Sign_Check<unsigned long long> { ACE_STATIC_CONSTANT (bool, is_signed = 0); };
00056 #else
00057   template<> struct Sign_Check<ACE_U_LongLong> { ACE_STATIC_CONSTANT (bool, is_signed = 0); };
00058 #endif  
00059 
00060   
00061   template<> struct Sign_Check<signed char>  { ACE_STATIC_CONSTANT (bool, is_signed = 1); };
00062   template<> struct Sign_Check<signed short> { ACE_STATIC_CONSTANT (bool, is_signed = 1); };
00063   template<> struct Sign_Check<signed int>   { ACE_STATIC_CONSTANT (bool, is_signed = 1); };
00064   template<> struct Sign_Check<signed long>  { ACE_STATIC_CONSTANT (bool, is_signed = 1); };
00065 #ifndef ACE_LACKS_LONGLONG_T
00066 # ifdef __GNUC__
00067   
00068   
00069   __extension__
00070 # endif  
00071   template<> struct Sign_Check<signed long long> { ACE_STATIC_CONSTANT (bool, is_signed = 1); };
00072 #endif  
00073 
00074   
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083   template<typename T> struct To_Unsigned;
00084 
00085   template<>
00086   struct To_Unsigned<unsigned char>
00087   {
00088     typedef unsigned char unsigned_type;
00089 
00090     unsigned_type operator() (unsigned_type x) { return x; }
00091   };
00092 
00093   template<>
00094   struct To_Unsigned<unsigned short>
00095   {
00096     typedef unsigned short unsigned_type;
00097 
00098     unsigned_type operator() (unsigned_type x) { return x; }
00099   };
00100 
00101   template<>
00102   struct To_Unsigned<unsigned int>
00103   {
00104     typedef unsigned int unsigned_type;
00105 
00106     unsigned_type operator() (unsigned_type x) { return x; }
00107   };
00108 
00109   template<>
00110   struct To_Unsigned<unsigned long>
00111   {
00112     typedef unsigned long unsigned_type;
00113 
00114     unsigned_type operator() (unsigned_type x) { return x; }
00115   };
00116 
00117 #ifndef ACE_LACKS_LONGLONG_T
00118 # ifdef __GNUC__
00119   
00120   
00121   __extension__
00122 # endif  
00123   template<>
00124   struct To_Unsigned<unsigned long long>
00125   {
00126     typedef unsigned long long unsigned_type;
00127 
00128     unsigned_type operator() (unsigned_type x) { return x; }
00129   };
00130 #else
00131   template<>
00132   struct To_Unsigned<ACE_U_LongLong>
00133   {
00134     typedef ACE_U_LongLong unsigned_type;
00135 
00136     unsigned_type operator() (unsigned_type x) { return x; }
00137   };
00138 #endif  
00139 
00140   
00141 
00142   template<>
00143   struct To_Unsigned<signed char>
00144   {
00145     typedef signed char   signed_type;
00146     typedef unsigned char unsigned_type;
00147 
00148     unsigned_type operator() (signed_type x)
00149     {
00150       return static_cast<unsigned_type> (x);
00151     }
00152   };
00153 
00154   template<>
00155   struct To_Unsigned<signed short>
00156   {
00157     typedef signed short   signed_type;
00158     typedef unsigned short unsigned_type;
00159 
00160     unsigned_type operator() (signed_type x)
00161     {
00162       return static_cast<unsigned_type> (x);
00163     }
00164   };
00165 
00166   template<>
00167   struct To_Unsigned<signed int>
00168   {
00169     typedef signed int   signed_type;
00170     typedef unsigned int unsigned_type;
00171 
00172     unsigned_type operator() (signed_type x)
00173     {
00174       return static_cast<unsigned_type> (x);
00175     }
00176   };
00177 
00178   template<>
00179   struct To_Unsigned<signed long>
00180   {
00181     typedef signed long   signed_type;
00182     typedef unsigned long unsigned_type;
00183 
00184     unsigned_type operator() (signed_type x)
00185     {
00186       return static_cast<unsigned_type> (x);
00187     }
00188   };
00189 
00190 #ifndef ACE_LACKS_LONGLONG_T
00191 # ifdef __GNUC__
00192   
00193   
00194   __extension__
00195 # endif  
00196   template<>
00197   struct To_Unsigned<signed long long>
00198   {
00199     typedef signed long long   signed_type;
00200     typedef unsigned long long unsigned_type;
00201 
00202     unsigned_type operator() (signed_type x)
00203     {
00204       return static_cast<unsigned_type> (x);
00205     }
00206   };
00207 #endif  
00208 
00209   
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223   template<typename LEFT,
00224            typename RIGHT,
00225            bool IS_LEFT_SIGNED,
00226            bool IS_RIGHT_SIGNED> struct Safe_Comparator;
00227 
00228   
00229   template<typename LEFT, typename RIGHT>
00230   struct Safe_Comparator<LEFT, RIGHT, true, false>
00231   {
00232     static bool greater_than (LEFT lhs, RIGHT rhs)
00233     {
00234       
00235       if (lhs < 0)
00236         return false;  
00237       else
00238         {
00239           
00240           return To_Unsigned<LEFT>() (lhs) > rhs;
00241         }
00242     }
00243   };
00244 
00245   
00246   template<typename LEFT, typename RIGHT>
00247   struct Safe_Comparator<LEFT, RIGHT, false, true>
00248   {
00249     static bool greater_than (LEFT lhs, RIGHT rhs)
00250     {
00251       
00252       if (rhs < 0)
00253         return true;  
00254       else
00255         {
00256           
00257           return lhs > To_Unsigned<RIGHT>() (rhs);
00258         }
00259     }
00260   };
00261 
00262   
00263   template<typename LEFT, typename RIGHT>
00264   struct Safe_Comparator<LEFT, RIGHT, false, false>
00265   {
00266     static bool greater_than (LEFT lhs, RIGHT rhs)
00267     {
00268       
00269       return lhs > rhs;
00270     }
00271   };
00272 
00273   
00274   template<typename LEFT, typename RIGHT>
00275   struct Safe_Comparator<LEFT, RIGHT, true, true>
00276   {
00277     static bool greater_than (LEFT lhs, RIGHT rhs)
00278     {
00279       
00280       return lhs > rhs;
00281     }
00282   };
00283 
00284   
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 
00299   template<typename LEFT, typename RIGHT>
00300   struct Fast_Comparator
00301   {
00302     ACE_STATIC_CONSTANT (
00303       bool,
00304       USE_LEFT  = ((sizeof (LEFT) > sizeof (RIGHT)
00305                     && (Sign_Check<LEFT>::is_signed == 1
00306                         || Sign_Check<RIGHT>::is_signed == 0))
00307 
00308                    
00309                    
00310                    || (sizeof (LEFT) == sizeof (RIGHT)
00311                        
00312                        
00313                        
00314                        
00315                        
00316                        
00317                        && ((Sign_Check<LEFT>::is_signed == 1
00318                             && Sign_Check<RIGHT>::is_signed == 1)
00319                            || (Sign_Check<LEFT>::is_signed == 0
00320                                && Sign_Check<RIGHT>::is_signed == 0)))));
00321 
00322     ACE_STATIC_CONSTANT (
00323       bool,
00324       USE_RIGHT = (sizeof (RIGHT) > sizeof (LEFT)
00325                    && (Sign_Check<RIGHT>::is_signed == 1
00326                        || Sign_Check<LEFT>::is_signed == 0)));
00327 
00328     ACE_STATIC_CONSTANT (bool, USABLE = (USE_LEFT || USE_RIGHT));
00329 
00330     typedef typename ACE::If_Then_Else<
00331       USE_LEFT,
00332       LEFT,
00333       typename ACE::If_Then_Else<
00334         USE_RIGHT,
00335         RIGHT,
00336         void>::result_type>::result_type promote_type;
00337 
00338     static bool greater_than (LEFT lhs, RIGHT rhs)
00339     {
00340       
00341       
00342       return
00343         (static_cast<promote_type> (lhs) > static_cast<promote_type> (rhs));
00344     }
00345 
00346   };
00347 
00348   
00349 
00350 
00351 
00352 
00353 
00354 
00355 
00356 
00357 
00358 
00359 
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 
00376   template<typename LEFT, typename RIGHT>
00377   struct Comparator
00378   {
00379     typedef typename ACE::If_Then_Else<
00380       Fast_Comparator<LEFT, RIGHT>::USABLE,
00381       Fast_Comparator<LEFT, RIGHT>,
00382       Safe_Comparator<LEFT,
00383                       RIGHT,
00384                       Sign_Check<LEFT>::is_signed,
00385                       Sign_Check<RIGHT>::is_signed> >::result_type comp_type;
00386   };
00387 
00388   
00389 
00390 
00391 
00392 
00393 
00394 
00395 
00396 
00397 
00398   template<typename FROM, typename TO>
00399   struct Truncator
00400   {
00401     ACE_STATIC_CONSTANT (
00402       bool,
00403       
00404       MAX_FROM_GT_MAX_TO = (sizeof(FROM) > sizeof (TO)
00405                             || (sizeof(FROM) == sizeof (TO)
00406                                 && Sign_Check<FROM>::is_signed == 0)));
00407 
00408     typedef typename ACE::If_Then_Else<
00409       MAX_FROM_GT_MAX_TO,
00410       FROM,
00411       TO>::result_type comp_to_type;
00412 
00413     
00414     
00415     
00416     
00417     typedef typename ACE::If_Then_Else<
00418       MAX_FROM_GT_MAX_TO,
00419       Fast_Comparator<FROM, comp_to_type>,
00420       typename Comparator<FROM, comp_to_type>::comp_type>::result_type comparator;
00421 
00422 
00423 
00424     TO operator() (FROM val)
00425     {
00426       return
00427         (comparator::greater_than (val, ACE_Numeric_Limits<TO>::max ())
00428          ? ACE_Numeric_Limits<TO>::max ()
00429          : static_cast<TO> (val));
00430     }
00431 
00432   };
00433 
00434   
00435   
00436   template<typename T>
00437   struct Truncator<T, T>
00438   {
00439     T operator() (T val)
00440     {
00441       return val;
00442     }
00443   };
00444 
00445 
00446 #if defined (ACE_LACKS_LONGLONG_T) || defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
00447   
00448   
00449   
00450   
00451   
00452   template<typename TO>
00453   struct Truncator<ACE_U_LongLong, TO>
00454   {
00455     TO operator() (ACE_U_LongLong const & val)
00456     {
00457       
00458       
00459       
00460       return
00461         (val > ACE_Numeric_Limits<TO>::max ()
00462          ? ACE_Numeric_Limits<TO>::max ()
00463          : static_cast<TO> (val.lo ()));
00464     }
00465   };
00466 #endif 
00467 
00468   
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 
00478   template<typename FROM, typename TO>
00479   struct Noop_Truncator
00480   {
00481     TO operator() (FROM val)
00482     {
00483       return static_cast<TO> (val);
00484     }
00485   };
00486   
00487 
00488 
00489 
00490 
00491 
00492 
00493 
00494 
00495 
00496 
00497 
00498 
00499 
00500 
00501   template<typename TO, typename FROM>
00502   inline TO truncate_cast (FROM val)
00503   {
00504     
00505     
00506     
00507     typedef typename ACE::If_Then_Else<
00508       (sizeof (FROM) < sizeof (TO)),
00509       Noop_Truncator<FROM, TO>,
00510       Truncator<FROM, TO> >::result_type truncator;
00511 
00512     return truncator() (val);
00513   }
00514 
00515 #else
00516 
00517   
00518   
00519   
00520 
00521 
00522 
00523 
00524 
00525 
00526   template<typename FROM, typename TO> struct Truncator;
00527 
00528   
00529   
00530   
00531 
00532   template<>
00533   struct Truncator<ACE_INT32, ACE_INT8>
00534   {
00535     ACE_INT8 operator() (ACE_INT32 val)
00536     {
00537       return
00538         (val > ACE_Numeric_Limits<ACE_INT8>::max ()
00539          ? ACE_Numeric_Limits<ACE_INT8>::max ()
00540          : static_cast<ACE_INT8> (val));
00541     }
00542   };
00543 
00544   template<>
00545   struct Truncator<ACE_UINT32, ACE_UINT8>
00546   {
00547     ACE_UINT8 operator() (ACE_UINT32 val)
00548     {
00549       return
00550         (val > static_cast<ACE_UINT32> (ACE_Numeric_Limits<ACE_UINT8>::max ())
00551          ? ACE_Numeric_Limits<ACE_UINT8>::max ()
00552          : static_cast<ACE_UINT8> (val));
00553     }
00554   };
00555 
00556   template<>
00557   struct Truncator<ACE_INT32, ACE_UINT8>
00558   {
00559     ACE_UINT8 operator() (ACE_INT32 val)
00560     {
00561       return
00562         (val > static_cast<ACE_INT32> (ACE_Numeric_Limits<ACE_UINT8>::max ())
00563          ? ACE_Numeric_Limits<ACE_UINT8>::max ()
00564          : static_cast<ACE_UINT8> (val));
00565     }
00566   };
00567 
00568   template<>
00569   struct Truncator<ACE_UINT32, ACE_INT8>
00570   {
00571     ACE_INT8 operator() (ACE_UINT32 val)
00572     {
00573       return
00574         (val > static_cast<ACE_UINT32> (ACE_Numeric_Limits<ACE_INT8>::max ())
00575          ? ACE_Numeric_Limits<ACE_INT8>::max ()
00576          : static_cast<ACE_INT8> (val));
00577     }
00578   };
00579 
00580 #if defined (ACE_SIZEOF_LONG) && ACE_SIZEOF_LONG < 8
00581   template<>
00582   struct Truncator<ACE_INT64, signed long>
00583   {
00584     signed long operator() (ACE_INT64 val)
00585     {
00586       return
00587         (val > ACE_Numeric_Limits<signed long>::max ()
00588          ? ACE_Numeric_Limits<signed long>::max ()
00589          : static_cast<signed long> (val));
00590     }
00591   };
00592 
00593   template<>
00594   struct Truncator<ACE_INT64, unsigned long>
00595   {
00596     unsigned long operator() (ACE_INT64 val)
00597     {
00598       return
00599         (val > static_cast<ACE_INT64> (ACE_Numeric_Limits<unsigned long>::max ())
00600          ? ACE_Numeric_Limits<unsigned long>::max ()
00601          : static_cast<unsigned long> (val));
00602     }
00603   };
00604 
00605   template<>
00606   struct Truncator<ACE_UINT64, unsigned long>
00607   {
00608     unsigned long operator() (ACE_UINT64 val)
00609     {
00610       return
00611         (val > static_cast<ACE_UINT64> (ACE_Numeric_Limits<unsigned long>::max ())
00612          ? ACE_Numeric_Limits<unsigned long>::max ()
00613          : static_cast<unsigned long> (val));
00614     }
00615   };
00616 
00617   template<>
00618   struct Truncator<ACE_UINT64, signed long>
00619   {
00620     signed long operator() (ACE_UINT64 val)
00621     {
00622       return
00623         (val > static_cast<ACE_UINT64> (ACE_Numeric_Limits<signed long>::max ())
00624          ? ACE_Numeric_Limits<signed long>::max ()
00625          : static_cast<signed long> (val));
00626     }
00627   };
00628 
00629   template<>
00630   struct Truncator<const ACE_UINT64, signed long>
00631   {
00632     signed long operator() (const ACE_UINT64 val)
00633     {
00634       return
00635         (val > static_cast<ACE_UINT64> (ACE_Numeric_Limits<signed long>::max ())
00636          ? ACE_Numeric_Limits<signed long>::max ()
00637          : static_cast<signed long> (val));
00638     }
00639   };
00640 
00641 #endif  
00642 
00643 #if defined (ACE_SIZEOF_INT) && ACE_SIZEOF_INT < 8
00644   template<>
00645   struct Truncator<ACE_INT64, signed int>
00646   {
00647     ACE_INT32 operator() (ACE_INT64 val)
00648     {
00649       return
00650         (val > ACE_Numeric_Limits<signed int>::max ()
00651          ? ACE_Numeric_Limits<signed int>::max ()
00652          : static_cast<signed int> (val));
00653     }
00654   };
00655 
00656   template<>
00657   struct Truncator<ACE_INT64, unsigned int>
00658   {
00659     ACE_UINT32 operator() (ACE_INT64 val)
00660     {
00661       return
00662         (val > static_cast<ACE_INT64> (ACE_Numeric_Limits<unsigned int>::max ())
00663          ? ACE_Numeric_Limits<unsigned int>::max ()
00664          : static_cast<unsigned int> (val));
00665     }
00666   };
00667 
00668   template<>
00669   struct Truncator<ACE_UINT64, unsigned int>
00670   {
00671     ACE_UINT32 operator() (ACE_UINT64 val)
00672     {
00673       return
00674         (val > static_cast<ACE_UINT64> (ACE_Numeric_Limits<unsigned int>::max ())
00675          ? ACE_Numeric_Limits<unsigned int>::max ()
00676          : static_cast<unsigned int> (val));
00677     }
00678   };
00679 
00680   template<>
00681   struct Truncator<ACE_UINT64, signed int>
00682   {
00683     signed int operator() (ACE_UINT64 val)
00684     {
00685       return
00686         (val > static_cast<ACE_UINT64> (ACE_Numeric_Limits<signed int>::max ())
00687          ? ACE_Numeric_Limits<signed int>::max ()
00688          : static_cast<signed int> (val));
00689     }
00690   };
00691 
00692 #endif  
00693 
00694   
00695   
00696   
00697 
00698   template<>
00699   struct Truncator<signed int, unsigned int>
00700   {
00701     unsigned int operator() (signed int val)
00702     {
00703       return static_cast<unsigned int> (val);
00704     }
00705   };
00706 
00707   template<>
00708   struct Truncator<unsigned int, signed int>
00709   {
00710     signed int operator() (unsigned int val)
00711     {
00712       return
00713         (val > static_cast<unsigned int> (ACE_Numeric_Limits<signed int>::max ())
00714          ? ACE_Numeric_Limits<signed int>::max ()
00715          : static_cast<signed int> (val));
00716     }
00717   };
00718 
00719   template<>
00720   struct Truncator<signed long, unsigned long>
00721   {
00722     unsigned long operator() (signed long val)
00723     {
00724       return static_cast<unsigned long> (val);
00725     }
00726   };
00727 
00728   template<>
00729   struct Truncator<unsigned long, signed long>
00730   {
00731     signed long operator() (unsigned long val)
00732     {
00733       return
00734         (val > static_cast<unsigned long> (ACE_Numeric_Limits<signed long>::max ())
00735          ? ACE_Numeric_Limits<signed long>::max ()
00736          : static_cast<signed long> (val));
00737     }
00738   };
00739 
00740 #if defined (ACE_SIZEOF_INT) && defined (ACE_SIZEOF_LONG) \
00741     && ACE_SIZEOF_INT == ACE_SIZEOF_LONG
00742 
00743   template<>
00744   struct Truncator<signed int, unsigned long>
00745   {
00746     unsigned long operator() (signed int val)
00747     {
00748       return static_cast<unsigned long> (val);
00749     }
00750   };
00751 
00752   template<>
00753   struct Truncator<unsigned long, signed int>
00754   {
00755     signed int operator() (unsigned long val)
00756     {
00757       return
00758         (val > static_cast<unsigned long> (ACE_Numeric_Limits<signed int>::max ())
00759          ? ACE_Numeric_Limits<signed int>::max ()
00760          : static_cast<signed int> (val));
00761     }
00762   };
00763 
00764   template<>
00765   struct Truncator<signed long, signed int>
00766   {
00767     signed int operator() (signed long val)
00768     {
00769       return static_cast<signed int> (val);
00770 
00771 
00772 
00773 
00774 
00775 
00776     }
00777   };
00778 
00779   template<>
00780   struct Truncator<signed long, unsigned int>
00781   {
00782     unsigned int operator() (signed long val)
00783     {
00784       return static_cast<unsigned int> (val);
00785     }
00786   };
00787 
00788   template<>
00789   struct Truncator<const signed long, unsigned int>
00790   {
00791     unsigned int operator() (const signed long val)
00792     {
00793       return static_cast<unsigned int> (val);
00794     }
00795   };
00796 
00797 
00798   template<>
00799   struct Truncator<unsigned int, signed long>
00800   {
00801     signed long operator() (unsigned int val)
00802     {
00803       return
00804         (val > static_cast<unsigned int> (ACE_Numeric_Limits<signed long>::max ())
00805          ? ACE_Numeric_Limits<signed long>::max ()
00806          : static_cast<signed long> (val));
00807     }
00808   };
00809 
00810 #endif  
00811 
00812   template<>
00813   struct Truncator<ACE_INT64, ACE_UINT64>
00814   {
00815     ACE_UINT64 operator() (ACE_INT64 val)
00816     {
00817       return static_cast<ACE_UINT64> (val);
00818     }
00819   };
00820 
00821   template<>
00822   struct Truncator<ACE_UINT64, ACE_INT64>
00823   {
00824     ACE_INT64 operator() (ACE_UINT64 val)
00825     {
00826       return
00827         (val > static_cast<ACE_UINT64> (ACE_Numeric_Limits<ACE_INT64>::max ())
00828          ? ACE_Numeric_Limits<ACE_INT64>::max ()
00829          : static_cast<ACE_INT64> (val));
00830     }
00831   };
00832 
00833   
00834   
00835   
00836 
00837   template<>
00838   struct Truncator<ACE_INT8, ACE_INT32>
00839   {
00840     ACE_INT32 operator() (ACE_INT8 val)
00841     {
00842       return static_cast<ACE_INT32> (val);
00843     }
00844   };
00845 
00846   template<>
00847   struct Truncator<ACE_UINT8, ACE_UINT32>
00848   {
00849     ACE_UINT32 operator() (ACE_UINT8 val)
00850     {
00851       return static_cast<ACE_UINT32> (val);
00852     }
00853   };
00854 
00855   template<>
00856   struct Truncator<ACE_UINT8, ACE_INT32>
00857   {
00858     ACE_INT32 operator() (ACE_UINT8 val)
00859     {
00860       return static_cast<ACE_INT32> (val);
00861     }
00862   };
00863 
00864   template<>
00865   struct Truncator<ACE_INT8, ACE_UINT32>
00866   {
00867     ACE_UINT32 operator() (ACE_INT8 val)
00868     {
00869       return static_cast<ACE_UINT32> (val);
00870     }
00871   };
00872 
00873 #if defined (ACE_SIZEOF_LONG) && ACE_SIZEOF_LONG < 8
00874   template<>
00875   struct Truncator<signed long, ACE_INT64>
00876   {
00877     ACE_INT64 operator() (signed long val)
00878     {
00879       return static_cast<ACE_INT64> (val);
00880     }
00881   };
00882 
00883   template<>
00884   struct Truncator<signed long, ACE_UINT64>
00885   {
00886     ACE_UINT64 operator() (signed long val)
00887     {
00888       return static_cast<ACE_UINT64> (val);
00889     }
00890   };
00891 
00892   template<>
00893   struct Truncator<unsigned long, ACE_UINT64>
00894   {
00895     ACE_UINT64 operator() (unsigned long val)
00896     {
00897       return static_cast<ACE_UINT64> (val);
00898     }
00899   };
00900 
00901   template<>
00902   struct Truncator<unsigned long, ACE_INT64>
00903   {
00904     ACE_INT64 operator() (unsigned long val)
00905     {
00906       return static_cast<ACE_INT64> (val);
00907     }
00908   };
00909 #endif  
00910 
00911 #if defined (ACE_SIZEOF_INT) && ACE_SIZEOF_INT < 8
00912   template<>
00913   struct Truncator<signed int, ACE_INT64>
00914   {
00915     ACE_INT64 operator() (signed int val)
00916     {
00917       return static_cast<ACE_INT64> (val);
00918     }
00919   };
00920 
00921   template<>
00922   struct Truncator<signed int, ACE_UINT64>
00923   {
00924     ACE_UINT64 operator() (signed int val)
00925     {
00926       return static_cast<ACE_UINT64> (val);
00927     }
00928   };
00929 
00930   template<>
00931   struct Truncator<unsigned int, ACE_UINT64>
00932   {
00933     ACE_UINT64 operator() (unsigned int val)
00934     {
00935       return static_cast<ACE_UINT64> (val);
00936     }
00937   };
00938 
00939   template<>
00940   struct Truncator<unsigned int, ACE_INT64>
00941   {
00942     ACE_INT64 operator() (unsigned int val)
00943     {
00944       return static_cast<ACE_INT64> (val);
00945     }
00946   };
00947 #endif  
00948 
00949   
00950   
00951   template<typename T>
00952   struct Truncator<T, T>
00953   {
00954     T operator() (T val)
00955     {
00956       return val;
00957     }
00958   };
00959 
00960   
00961   
00962   
00963   
00964   
00965   template<typename T>
00966   struct Truncator<T const, T>
00967   {
00968     T operator() (T val)
00969     {
00970       return val;
00971     }
00972   };
00973 
00974   
00975 
00976   template<typename TO, typename FROM>
00977   inline TO truncate_cast (FROM val)
00978   {
00979     typedef Truncator<FROM, TO> truncator;
00980 
00981     return truncator() (val);
00982   }
00983 
00984 #endif  
00985 
00986 } 
00987 
00988 ACE_END_VERSIONED_NAMESPACE_DECL
00989 
00990 #include  "ace/post.h"
00991 
00992 #endif