00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _OSGBASETYPETRAITS_H_
00040 #define _OSGBASETYPETRAITS_H_
00041 #ifdef __sgi
00042 #pragma once
00043 #endif
00044
00045 #ifndef _OSGBASETYPES_H_
00046 #error not for direct use, please include OSGBaseTypes.h instead
00047 #endif
00048
00049 #include <OSGGL.h>
00050 #include <limits>
00051
00052
00053
00054 #if defined(max)
00055 #undef max
00056 #endif
00057
00058 #if defined(min)
00059 #undef min
00060 #endif
00061
00062 OSG_BEGIN_NAMESPACE
00063
00067 struct OSG_BASE_DLLMAPPING TypeTraitsBase
00068 {
00069 #ifdef GV_CHECK_CHECK
00070 static const bool IsPOD = true;
00071 static const MathTypeProperties MathProp = BoolValue;
00072
00073 static const bool BitsSet = true ;
00074 static const bool BitsClear = false;
00075
00076 static bool getZeroElement(void)
00077 {
00078 return false;
00079 }
00080
00081 static bool getOneElement (void)
00082 {
00083 return true;
00084 }
00085
00086 static bool getMax (void)
00087 {
00088 return true;
00089 }
00090
00091 static bool getMin (void)
00092 {
00093 return false;
00094 }
00095 #endif
00096 };
00097
00101 template <class LookupTypeT>
00102 struct TypeTraits : public TypeTraitsBase
00103 {
00104 static const bool IsPOD = false;
00105
00106 #ifdef OSG_MICROSOFT_COMPILER_HACKS
00107 typedef LookupTypeT RealReturnType;
00108 #endif
00109 };
00110
00111 #if defined(__hpux)
00112 template <class LookupTypeT>
00113 const bool TypeTraits<LookupTypeT>::IsPOD;
00114 #endif
00115
00116
00120 template <>
00121 struct TypeTraits<bool> : public TypeTraitsBase
00122 {
00123 static const bool IsPOD = true;
00124 static const MathTypeProperties MathProp = BoolValue;
00125
00126 static const bool BitsSet = true ;
00127 static const bool BitsClear = false;
00128
00129
00130 static bool getZeroElement(void)
00131 {
00132 return false;
00133 }
00134
00135 static bool getOneElement (void)
00136 {
00137 return true;
00138 }
00139
00140 static bool getMax (void)
00141 {
00142 return true;
00143 }
00144
00145 static bool getMin (void)
00146 {
00147 return false;
00148 }
00149 };
00150
00151
00155 template <>
00156 struct TypeTraits<UInt8> : public TypeTraitsBase
00157 {
00158 typedef Real32 RealReturnType;
00159
00160
00161 static const bool IsPOD = true;
00162 static const MathTypeProperties MathProp = IntValue;
00163
00164 static const UInt8 BitsSet = 0xFF;
00165 static const UInt8 BitsClear = 0x00;
00166
00167
00168 static UInt8 getZeroElement(void)
00169 {
00170 return 0;
00171 }
00172
00173 static UInt8 getOneElement (void)
00174 {
00175 return 1;
00176 }
00177
00178 static UInt8 getMax (void)
00179 {
00180 return std::numeric_limits<UInt8>::max();
00181 }
00182
00183 static UInt8 getMin (void)
00184 {
00185 return std::numeric_limits<UInt8>::min();
00186 }
00187
00188
00189 static Real32 getFraction (UInt8 val)
00190 {
00191 return (Real32(val) / Real32(getMax()));
00192 };
00193
00194 static UInt8 getPortion (Real32 val)
00195 {
00196 #ifdef OSG_WIN32_ICL
00197 #pragma warning (disable : 810)
00198 #endif
00199 return UInt8((val * Real32(getMax())));
00200 #ifdef OSG_WIN32_ICL
00201 #pragma warning (default : 810)
00202 #endif
00203 };
00204
00205
00206 static UInt8 getFromString(const Char8 *szString)
00207 {
00208 if(szString != NULL)
00209 {
00210 return UInt8(strtoul(szString, NULL, 0));
00211 }
00212 else
00213 {
00214 return getZeroElement();
00215 }
00216 }
00217
00218 static std::string putToString (const UInt8 val)
00219 {
00220 Char8 buffer[10];
00221
00222 sprintf(buffer, "%u", val);
00223
00224 return std::string(buffer);
00225 }
00226 };
00227
00228
00232 template <>
00233 struct TypeTraits<Int8> : public TypeTraitsBase
00234 {
00235 typedef Real32 RealReturnType;
00236
00237
00238 static const bool IsPOD = true;
00239 static const MathTypeProperties MathProp = IntValue;
00240
00241 static const Int8 BitsSet = -1;
00242 static const Int8 BitsClear = 0x00;
00243
00244
00245 static Int8 getZeroElement(void)
00246 {
00247 return 0;
00248 }
00249
00250 static Int8 getOneElement (void)
00251 {
00252 return 1;
00253 }
00254
00255 static Int8 getMin (void)
00256 {
00257 return std::numeric_limits<Int8>::min();
00258 }
00259
00260 static Int8 getMax (void)
00261 {
00262 return std::numeric_limits<Int8>::max();
00263 }
00264
00265
00266 static Real32 getFraction (Int8 val)
00267 {
00268 return (Real32(val) / Real32(getMax()));
00269 };
00270
00271 static Int8 getPortion (Real32 val)
00272 {
00273 return (Int8) (val * Real32(getMax()));
00274 };
00275
00276
00277 static Int8 getFromString(const Char8 *szString)
00278 {
00279 if(szString != NULL)
00280 {
00281 return Int8(strtol(szString, NULL, 0));
00282 }
00283 else
00284 {
00285 return getZeroElement();
00286 }
00287 }
00288
00289 static std::string putToString (const Int8 val)
00290 {
00291 Char8 buffer[10];
00292
00293 sprintf(buffer, "%i", val);
00294
00295 return std::string(buffer);
00296 }
00297 };
00298
00299
00303 template <>
00304 struct TypeTraits<UInt16> : public TypeTraitsBase
00305 {
00306 typedef Real32 RealReturnType;
00307
00308
00309 static const bool IsPOD = true;
00310 static const MathTypeProperties MathProp = IntValue;
00311
00312 static const UInt16 BitsSet = 0xFFFF;
00313 static const UInt16 BitsClear = 0x0000;
00314
00315
00316 static UInt16 getZeroElement(void)
00317 {
00318 return 0;
00319 }
00320
00321 static UInt16 getOneElement (void)
00322 {
00323 return 1;
00324 }
00325
00326 static UInt16 getMax (void)
00327 {
00328 return std::numeric_limits<UInt16>::max();
00329 }
00330
00331 static UInt16 getMin (void)
00332 {
00333 return std::numeric_limits<UInt16>::min();
00334 }
00335
00336
00337 static Real32 getFraction (UInt16 val)
00338 {
00339 return (Real32(val) / Real32(getMax()));
00340 };
00341
00342 static UInt16 getPortion (Real32 val)
00343 {
00344 return (UInt16) (val * Real32(getMax()));
00345 };
00346
00347
00348 static UInt16 getFromString(const Char8 *szString)
00349 {
00350 if(szString != NULL)
00351 {
00352 return UInt16(strtoul(szString, NULL, 0));
00353 }
00354 else
00355 {
00356 return getZeroElement();
00357 }
00358 }
00359
00360 static std::string putToString (const UInt16 val)
00361 {
00362 Char8 buffer[10];
00363
00364
00365 #ifdef WIN32
00366 sprintf(buffer, "%u", UInt32(val));
00367 #else
00368 sprintf(buffer, "%u", val);
00369 #endif
00370
00371 return std::string(buffer);
00372 }
00373 };
00374
00375
00379 template <>
00380 struct TypeTraits<Int16> : public TypeTraitsBase
00381 {
00382 typedef Real32 RealReturnType;
00383
00384
00385 static const bool IsPOD = true;
00386 static const MathTypeProperties MathProp = IntValue;
00387
00388 static const Int16 BitsSet = -1;
00389 static const Int16 BitsClear = 0x0000;
00390
00391
00392 static Int16 getZeroElement(void)
00393 {
00394 return 0;
00395 }
00396
00397 static Int16 getOneElement (void)
00398 {
00399 return 1;
00400 }
00401
00402 static Int16 getMax (void)
00403 {
00404 return std::numeric_limits<Int16>::max();
00405 }
00406
00407 static Int16 getMin (void)
00408 {
00409 return std::numeric_limits<Int16>::min();
00410 }
00411
00412
00413 static Real32 getFraction (Int16 val)
00414 {
00415 return (Real32(val) / Real32(getMax()));
00416 };
00417
00418 static Int16 getPortion (Real32 val)
00419 {
00420 return (Int16) (val * Real32(getMax()));
00421 };
00422
00423
00424 static Int16 getFromString(const Char8 *szString)
00425 {
00426 if(szString != NULL)
00427 {
00428 return Int16(strtol(szString, NULL, 0));
00429 }
00430 else
00431 {
00432 return getZeroElement();
00433 }
00434 }
00435
00436 static std::string putToString (const Int16 val)
00437 {
00438 Char8 buffer[10];
00439
00440 sprintf(buffer, "%i", val);
00441
00442 return std::string(buffer);
00443 }
00444 };
00445
00446
00450 template <>
00451 struct TypeTraits<UInt32> : public TypeTraitsBase
00452 {
00453 typedef Real32 RealReturnType;
00454
00455
00456 static const bool IsPOD = true;
00457 static const MathTypeProperties MathProp = IntValue;
00458
00459 static const UInt32 BitsSet = 0xFFFFFFFF;
00460 static const UInt32 BitsClear = 0x00000000;
00461
00462
00463 static UInt32 getZeroElement(void)
00464 {
00465 return 0;
00466 }
00467
00468 static UInt32 getOneElement (void)
00469 {
00470 return 1;
00471 }
00472
00473 static UInt32 getMax (void)
00474 {
00475 return std::numeric_limits<UInt32>::max();
00476 }
00477
00478 static UInt32 getMin (void)
00479 {
00480 return std::numeric_limits<UInt32>::min();
00481 }
00482
00483
00484 static Real32 getFraction (UInt32 val)
00485 {
00486 return (Real32(val) / Real32(getMax()));
00487 };
00488
00489 static UInt32 getPortion (Real32 val)
00490 {
00491 return (UInt32) (val * Real32(getMax()));
00492 };
00493
00494
00495 static UInt32 getFromString(const Char8 *szString)
00496 {
00497 if(szString != NULL)
00498 {
00499 return UInt32(strtoul(szString, NULL, 0));
00500 }
00501 else
00502 {
00503 return getZeroElement();
00504 }
00505 }
00506
00507 static std::string putToString (const UInt32 val)
00508 {
00509 Char8 buffer[15];
00510
00511 sprintf(buffer, "%u", val);
00512
00513 return std::string(buffer);
00514 }
00515 };
00516
00517
00521 template <>
00522 struct TypeTraits<Int32> : public TypeTraitsBase
00523 {
00524 typedef Real32 RealReturnType;
00525
00526
00527 static const bool IsPOD = true;
00528 static const MathTypeProperties MathProp = IntValue;
00529
00530 static const Int32 BitsSet = 0xFFFFFFFF;
00531 static const Int32 BitsClear = 0x00000000;
00532
00533
00534 static Int32 getZeroElement(void)
00535 {
00536 return 0;
00537 }
00538
00539 static Int32 getOneElement (void)
00540 {
00541 return 1;
00542 }
00543
00544 static Int32 getMax (void)
00545 {
00546 return std::numeric_limits<Int32>::max();
00547 }
00548
00549 static Int32 getMin (void)
00550 {
00551 return std::numeric_limits<Int32>::min();
00552 }
00553
00554
00555 static Real32 getFraction (Int32 val)
00556 {
00557 return (Real32(val) / Real32(getMax()));
00558 };
00559
00560 static Int32 getPortion (Real32 val)
00561 {
00562 return (Int32) (val * Real32(getMax()));
00563 };
00564
00565
00566 static Int32 getFromString(const Char8 *szString)
00567 {
00568 if(szString != NULL)
00569 {
00570 return Int32(strtol(szString, NULL, 0));
00571 }
00572 else
00573 {
00574 return getZeroElement();
00575 }
00576 }
00577
00578 static std::string putToString (const Int32 val)
00579 {
00580 Char8 buffer[15];
00581
00582 sprintf(buffer, "%i", val);
00583
00584 return std::string(buffer);
00585 }
00586 };
00587
00588
00592 template <>
00593 struct TypeTraits<UInt64> : public TypeTraitsBase
00594 {
00595 typedef Real32 RealReturnType;
00596
00597
00598 static const bool IsPOD = true;
00599 static const MathTypeProperties MathProp = IntValue;
00600
00601 #ifdef OSG_LONGLONG_HAS_LL
00602 static const UInt64 BitsSet = 0xFFFFFFFFFFFFFFFFLL;
00603 static const UInt64 BitsClear = 0x0000000000000000LL;
00604
00605 static const UInt64 Zero = 0x0000000000000000LL;
00606 static const UInt64 One = 0x0000000000000001LL;
00607 #else
00608 static const UInt64 BitsSet = 0xFFFFFFFFFFFFFFFF;
00609 static const UInt64 BitsClear = 0x0000000000000000;
00610
00611 static const UInt64 Zero = 0x0000000000000000;
00612 static const UInt64 One = 0x0000000000000001;
00613 #endif
00614
00615
00616
00617 static UInt64 getZeroElement(void)
00618 {
00619 return 0;
00620 }
00621
00622 static UInt64 getOneElement (void)
00623 {
00624 return 1;
00625 }
00626
00627
00628 static UInt64 getMax (void)
00629 {
00630 return std::numeric_limits<UInt64>::max();
00631 }
00632
00633 static UInt64 getMin (void)
00634 {
00635 return std::numeric_limits<UInt64>::min();
00636 }
00637
00638
00639 static Real32 getFraction (UInt64 val)
00640 {
00641 return (Real32(val) / Real32(getMax()));
00642 };
00643
00644 static UInt64 getPortion (Real32 val)
00645 {
00646 return (UInt64) (val * Real32(getMax()));
00647 };
00648
00649
00650 static UInt64 getFromString(const Char8 *szString)
00651 {
00652 if(szString != NULL)
00653 {
00654 #ifndef WIN32
00655 #ifdef __sgi
00656
00657
00658 UInt64 r = 0;
00659 sscanf(szString, "%llu", &r);
00660 return r;
00661 #else
00662 return UInt64(strtoull(szString, NULL, 0));
00663 #endif
00664 #else
00665 return _atoi64(szString);
00666 #endif
00667 }
00668 else
00669 {
00670 return getZeroElement();
00671 }
00672 }
00673
00674 static std::string putToString (const UInt64 val)
00675 {
00676 Char8 buffer[25];
00677 #ifdef __x86_64__
00678 sprintf(buffer, "%lu", val);
00679 #else
00680 sprintf(buffer, "%llu", val);
00681 #endif
00682 return std::string(buffer);
00683 }
00684 };
00685
00686
00690 template <>
00691 struct TypeTraits<Int64> : public TypeTraitsBase
00692 {
00693 typedef Real32 RealReturnType;
00694
00695
00696 static const bool IsPOD = true;
00697 static const MathTypeProperties MathProp = IntValue;
00698
00699 #ifdef OSG_LONGLONG_HAS_LL
00700 static const Int64 BitsSet = 0xFFFFFFFFFFFFFFFFLL;
00701 static const Int64 BitsClear = 0x0000000000000000LL;
00702 #else
00703 static const Int64 BitsSet = 0xFFFFFFFFFFFFFFFF;
00704 static const Int64 BitsClear = 0x0000000000000000;
00705 #endif
00706
00707
00708 static Int64 getZeroElement(void)
00709 {
00710 return 0;
00711 }
00712
00713 static Int64 getOneElement (void)
00714 {
00715 return 1;
00716 }
00717
00718 static Int64 getMax (void)
00719 {
00720 return std::numeric_limits<Int64>::max();
00721 }
00722
00723 static Int64 getMin (void)
00724 {
00725 return std::numeric_limits<Int64>::min();
00726 }
00727
00728
00729 static Real32 getFraction (Int64 val)
00730 {
00731 return (Real32(val) / Real32(getMax()));
00732 };
00733
00734 static Int64 getPortion (Real32 val)
00735 {
00736 return (Int64) (val * Real32(getMax()));
00737 };
00738
00739
00740 static Int64 getFromString(const Char8 *szString)
00741 {
00742 if(szString != NULL)
00743 {
00744 #ifndef WIN32
00745 #ifdef __sgi
00746
00747
00748 Int64 r = 0;
00749 sscanf(szString, "%lld", &r);
00750 return r;
00751 #else
00752 return Int64(strtoll(szString, NULL, 0));
00753 #endif
00754 #else
00755 return _atoi64(szString);
00756 #endif
00757 }
00758 else
00759 {
00760 return getZeroElement();
00761 }
00762 }
00763
00764 static std::string putToString (const Int64 val)
00765 {
00766 Char8 buffer[25];
00767
00768 #ifdef __x86_64__
00769 sprintf(buffer, "%li", val);
00770 #else
00771 sprintf(buffer, "%lli", val);
00772 #endif
00773
00774 return std::string(buffer);
00775 }
00776 };
00777
00781 template <>
00782 struct TypeTraits<Real16> : public TypeTraitsBase
00783 {
00784 typedef Real16 RealReturnType;
00785
00786
00787 static const bool IsPOD = true;
00788 static const MathTypeProperties MathProp = RealValue;
00789
00790 static Real16 getZeroElement(void)
00791 {
00792 return Real16( 0.f );
00793 }
00794
00795 static Real16 getOneElement (void)
00796 {
00797 return Real16( 1.f );
00798 }
00799
00800 static Real16 getMax (void)
00801 {
00802 return REAL16_MAX;
00803 }
00804
00805 static Real16 getMin (void)
00806 {
00807 return REAL16_MIN;
00808 }
00809
00810
00811 static Real16 getFraction (Real16 rVal) { return rVal; };
00812 static Real16 getPortion (Real16 rVal) { return rVal; };
00813
00814
00815 static Real16 getFromString (const Char8 *szString)
00816 {
00817 if(szString != NULL)
00818 {
00819 #if defined(__sgi) || defined(WIN32) || defined(__sun)
00820 return Real16(Real32(atof (szString)));
00821 #else
00822 return Real16(Real32(strtof(szString, NULL)));
00823 #endif
00824 }
00825 else
00826 {
00827 return getZeroElement();
00828 }
00829 }
00830
00831 static std::string putToString(const Real16 val)
00832 {
00833 Char8 buffer[20];
00834
00835 sprintf(buffer, "%e", (Real32) val);
00836
00837 return std::string(buffer);
00838 }
00839
00840 };
00841
00842
00846 template <>
00847 struct TypeTraits<Real32> : public TypeTraitsBase
00848 {
00849 typedef Real32 RealReturnType;
00850
00851
00852 static const bool IsPOD = true;
00853 static const MathTypeProperties MathProp = RealValue;
00854
00855 static Real32 getZeroElement(void)
00856 {
00857 return 0.f;
00858 }
00859
00860 static Real32 getOneElement (void)
00861 {
00862 return 1.f;
00863 }
00864
00865 static Real32 getMax (void)
00866 {
00867 return FLT_MAX;
00868 }
00869
00870 static Real32 getMin (void)
00871 {
00872 return FLT_MIN;
00873 }
00874
00875
00876 static Real32 getFraction (Real32 rVal) { return rVal; };
00877 static Real32 getPortion (Real32 rVal) { return rVal; };
00878
00879
00880 static Real32 getFromString (const Char8 *szString)
00881 {
00882 if(szString != NULL)
00883 {
00884 #if defined(__sgi) || defined(WIN32) || defined(__sun)
00885 return Real32(atof (szString));
00886 #else
00887 return Real32(strtof(szString, NULL));
00888 #endif
00889 }
00890 else
00891 {
00892 return getZeroElement();
00893 }
00894 }
00895
00896 static std::string putToString(const Real32 val)
00897 {
00898 Char8 buffer[20];
00899
00900 sprintf(buffer, "%e", val);
00901
00902 return std::string(buffer);
00903 }
00904
00905 };
00906
00907
00911 template <>
00912 struct TypeTraits<Real64> : public TypeTraitsBase
00913 {
00914 typedef Real64 RealReturnType;
00915
00916
00917 static const bool IsPOD = true;
00918 static const MathTypeProperties MathProp = RealValue;
00919
00920 static Real64 getZeroElement(void)
00921 {
00922 return 0.0;
00923 }
00924
00925 static Real64 getOneElement (void)
00926 {
00927 return 1.0;
00928 }
00929
00930 static Real64 getMax (void)
00931 {
00932 return DBL_MAX;
00933 }
00934
00935 static Real64 getMin (void)
00936 {
00937 return DBL_MIN;
00938 }
00939
00940
00941 static Real64 getFraction (Real64 rVal) { return rVal; };
00942 static Real64 getPortion (Real64 rVal) { return rVal; };
00943
00944
00945 static Real64 getFromString (const Char8 *szString)
00946 {
00947 if(szString != NULL)
00948 {
00949 return Real64(strtod(szString, NULL));
00950 }
00951 else
00952 {
00953 return getZeroElement();
00954 }
00955 }
00956
00957 static std::string putToString(const Real64 val)
00958 {
00959 Char8 buffer[25];
00960
00961 sprintf(buffer, "%e", val);
00962
00963 return std::string(buffer);
00964 }
00965 };
00966
00967
00971 template <>
00972 struct TypeTraits<Real128> : public TypeTraitsBase
00973 {
00974 typedef Real128 RealReturnType;
00975
00976
00977 static const bool IsPOD = true;
00978 static const MathTypeProperties MathProp = RealValue;
00979
00980 static Real128 getZeroElement(void)
00981 {
00982 return 0.0;
00983 }
00984
00985 static Real128 getOneElement (void)
00986 {
00987 return 1.0;
00988 }
00989
00990 static Real128 getMax (void)
00991 {
00992 return DBL_MAX;
00993 }
00994
00995 static Real128 getMin (void)
00996 {
00997 return DBL_MIN;
00998 }
00999
01000
01001 static Real128 getFraction (Real128 rVal) { return rVal; };
01002 static Real128 getPortion (Real128 rVal) { return rVal; };
01003
01004
01005 static Real128 getFromString (const Char8 *szString)
01006 {
01007 if(szString != NULL)
01008 {
01009 #if defined(WIN32) || defined(__sun)
01010 return Real128(strtod(szString, NULL));
01011 #else
01012 return Real128(strtold(szString, NULL));
01013 #endif
01014 }
01015 else
01016 {
01017 return getZeroElement();
01018 }
01019 }
01020
01021 static std::string putToString(const Real128 val)
01022 {
01023 Char8 buffer[25];
01024
01025 sprintf(buffer, "%Le", val);
01026
01027 return std::string(buffer);
01028 }
01029 };
01030
01031
01032 #ifdef OSG_GLENUM_NEQ_UINT32
01033
01037 template <>
01038 struct TypeTraits<GLenum> : public TypeTraitsBase
01039 {
01040 typedef Real32 RealReturnType;
01041
01042
01043 static const bool IsPOD = true;
01044 static const MathTypeProperties MathProp = IntValue;
01045
01046 static const UInt32 BitsSet = 0xFFFFFFFF;
01047 static const UInt32 BitsClear = 0x00000000;
01048
01049
01050 static GLenum getZeroElement(void)
01051 {
01052 return 0;
01053 }
01054
01055 static GLenum getOneElement (void)
01056 {
01057 return 1;
01058 }
01059
01060 static GLenum getMax (void)
01061 {
01062 return 0xFFFFFFFF;
01063 }
01064
01065 static GLenum getMin (void)
01066 {
01067 return 0x00000000;
01068 }
01069
01070
01071 static GLenum getFromString(const Char8 *szString)
01072 {
01073 if(szString != NULL)
01074 {
01075 return GLenum(strtoul(szString, NULL, 0));
01076 }
01077 else
01078 {
01079 return getZeroElement();
01080 }
01081 }
01082
01083 static std::string putToString (const GLenum val)
01084 {
01085 Char8 buffer[15];
01086
01087 sprintf(buffer, "%lu", static_cast<unsigned long>(val));
01088
01089 return std::string(buffer);
01090 }
01091 };
01092
01093 #endif
01094
01095 OSG_END_NAMESPACE
01096
01097 #ifndef OSG_DISABLE_DEPRECATED
01098 #define TypeConstants TypeTraits
01099 #define getAllSet() BitsSet
01100 #endif
01101
01102 #define OSGBASETYPETRAITS_HEADER_CVSID "@(#)$Id: $"
01103
01104 #endif