ctr64.cpp
上传用户:cnryan
上传日期:2008-12-15
资源大小:260k
文件大小:11k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*_############################################################################
  2.   _## 
  3.   _##  ctr64.cpp  
  4.   _##
  5.   _##  SNMP++v3.2.21
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2006 Jochen Katz, Frank Fock
  8.   _##
  9.   _##  This software is based on SNMP++2.6 from Hewlett Packard:
  10.   _##  
  11.   _##    Copyright (c) 1996
  12.   _##    Hewlett-Packard Company
  13.   _##  
  14.   _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  15.   _##  Permission to use, copy, modify, distribute and/or sell this software 
  16.   _##  and/or its documentation is hereby granted without fee. User agrees 
  17.   _##  to display the above copyright notice and this license notice in all 
  18.   _##  copies of the software and any documentation of the software. User 
  19.   _##  agrees to assume all liability for the use of the software; 
  20.   _##  Hewlett-Packard and Jochen Katz make no representations about the 
  21.   _##  suitability of this software for any purpose. It is provided 
  22.   _##  "AS-IS" without warranty of any kind, either express or implied. User 
  23.   _##  hereby grants a royalty-free license to any and all derivatives based
  24.   _##  upon this software code base. 
  25.   _##  
  26.   _##  Stuttgart, Germany, Fri Jun 16 17:48:57 CEST 2006 
  27.   _##  
  28.   _##########################################################################*/
  29. /*===================================================================
  30.   Copyright (c) 1999
  31.   Hewlett-Packard Company
  32.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  33.   Permission to use, copy, modify, distribute and/or sell this software
  34.   and/or its documentation is hereby granted without fee. User agrees
  35.   to display the above copyright notice and this license notice in all
  36.   copies of the software and any documentation of the software. User
  37.   agrees to assume all liability for the use of the software; Hewlett-Packard
  38.   makes no representations about the suitability of this software for any
  39.   purpose. It is provided "AS-IS" without warranty of any kind,either express
  40.   or implied. User hereby grants a royalty-free license to any and all
  41.   derivatives based upon this software code base.
  42.   C O U N T E R 6 4. C P P
  43.   COUNTER64 CLASS IMPLEMENTATION
  44.   DESIGN + AUTHOR:     Peter E. Mellquist
  45.   LANGUAGE:            ANSI C++
  46.   DESCRIPTION:         Implementation for Counter64 (64 bit counter class).
  47. =====================================================================*/
  48. char counter64_cpp_version[]="@(#) SNMP++ $Id: ctr64.cpp,v 1.7 2006/03/10 21:08:52 katz Exp $";
  49. #include "snmp_pp/ctr64.h"
  50. #include <stdio.h>   // for pretty printing...
  51. #ifdef SNMP_PP_NAMESPACE
  52. namespace Snmp_pp {
  53. #endif
  54. #define MAX32 4294967295u
  55. //------------------[ constructor with no value ]------------------------
  56. Counter64::Counter64() : m_changed(true)
  57. {
  58.   smival.syntax = sNMP_SYNTAX_CNTR64;
  59.   smival.value.hNumber.hipart = 0;
  60.   smival.value.hNumber.lopart = 0;
  61. }
  62. //------------------[ constructor with values ]--------------------------
  63. Counter64::Counter64(unsigned long hi, unsigned long lo) : m_changed(true)
  64. {
  65.   smival.syntax = sNMP_SYNTAX_CNTR64;
  66.   smival.value.hNumber.hipart = hi;
  67.   smival.value.hNumber.lopart = lo;
  68. }
  69. //------------------[ constructor with low value only ]------------------
  70. Counter64::Counter64(unsigned long lo) : m_changed(true)
  71. {
  72.   smival.syntax = sNMP_SYNTAX_CNTR64;
  73.   smival.value.hNumber.hipart = 0;
  74.   smival.value.hNumber.lopart = lo;
  75. }
  76. //------------------[ copy constructor ]---------------------------------
  77. Counter64::Counter64(const Counter64 &ctr64 ) : m_changed(true)
  78. {
  79.   smival.syntax = sNMP_SYNTAX_CNTR64;
  80.   smival.value.hNumber.hipart = ctr64.high();
  81.   smival.value.hNumber.lopart = ctr64.low();
  82. }
  83. //------------------[ operator=(const Counter64 &ctr64) ]-------------
  84. // assign a ctr64 to a ctr64
  85. Counter64& Counter64::operator=(const Counter64 &ctr64)
  86. {
  87.   if (this == &ctr64) return *this;  // check for self assignment
  88.   smival.value.hNumber.hipart = ctr64.high();
  89.   smival.value.hNumber.lopart = ctr64.low();
  90.   m_changed = true;
  91.   return *this;
  92. }
  93. //-------------------[ operator=(const unsigned long int i) ]---------
  94. // assign a ul to a ctr64, clears the high part
  95. // and assugns the low part
  96. Counter64& Counter64::operator=(const unsigned long i)
  97. {
  98.   smival.value.hNumber.hipart = 0;
  99.   smival.value.hNumber.lopart = i;
  100.   m_changed = true;
  101.   return *this;
  102. }
  103. //-----------[ c64_to_ld(Counter64 c64) ]-----------------------------
  104. // convert a Counter 64 to a long double
  105. long double Counter64::c64_to_ld(const Counter64 &c64)
  106. {
  107.   long double ld = c64.high();
  108.   ld *= (long double)MAX32 + 1.0l; // gotta be MAX32 + 1 to move it to next pos
  109.   ld += c64.low();
  110.   return ld;
  111. }
  112. //-----------[ c64_to_ld( ) ]------------------------------------------
  113. long double Counter64::c64_to_ld() const
  114. {
  115.   long double ld = high();
  116.   ld *= (long double)MAX32 + 1.0l; // gotta be MAX32 + 1 to move it to next pos
  117.   ld += low();
  118.   return ld;
  119. }
  120. //-----------[ ld_to_c64(long double ld) ]----------------------------
  121. // convert a long double to a Counter64
  122. Counter64 Counter64::ld_to_c64(const long double &ld)
  123. {
  124.   long double high = MAX32 + 1.0l; // look above
  125.   unsigned long h = (unsigned long)(ld / high);
  126.   return Counter64(h, (unsigned long)(ld - (h * high)));
  127. }
  128. //-----------[ c64_to_ll(Counter64 c64) ]-----------------------------
  129. // convert a Counter 64 to a 64 bit integer
  130. pp_uint64 Counter64::c64_to_ll(const Counter64 &c64)
  131. {
  132.   pp_uint64 ll = c64.high();
  133.   ll *= (pp_uint64)MAX32 + (pp_uint64)1; // gotta be MAX32 + 1 to move it to next pos
  134.   ll += c64.low();
  135.   return ll;
  136. }
  137. //-----------[ c64_to_ll( ) ]------------------------------------------
  138. pp_uint64 Counter64::c64_to_ll() const
  139. {
  140.   pp_uint64 ll = high();
  141.   ll *= (pp_uint64)MAX32 + (pp_uint64)1; // gotta be MAX32 + 1 to move it to next pos
  142.   ll += low();
  143.   return ll;
  144. }
  145. //-----------[ ll_to_c64(pp_uint64 ll) ]----------------------------
  146. // convert a 64 bit integer to a Counter64
  147. Counter64 Counter64::ll_to_c64(const pp_uint64 &ll)
  148. {
  149.   pp_uint64 high = (pp_uint64)MAX32 + (pp_uint64)1; // look above
  150.   unsigned long h = (unsigned long)(ll / high);
  151.   return Counter64(h, (unsigned long)(ll - (h * high)));
  152. }
  153. //----------[ Counter64::operator+(const Counter64 &c) ]---------------
  154. // add two Counter64s
  155. Counter64 Counter64::operator+(const Counter64 &c) const
  156. {
  157.   pp_uint64 llsum = c64_to_ll() + c.c64_to_ll();
  158.   return ll_to_c64(llsum);
  159. }
  160. //------------[ Counter64::operator-(const Counter64 &c) ]-------------
  161. // subtract two Counter64s
  162. Counter64 Counter64::operator-(const Counter64 &c) const
  163. {
  164.   pp_uint64 lldiff = c64_to_ll() - c.c64_to_ll();
  165.   return ll_to_c64(lldiff);
  166. }
  167. //------------[ Counter64::operator*(const Counter64 &c) ]-------------
  168. // multiply two Counter64s
  169. Counter64 Counter64::operator*(const Counter64 &c) const
  170. {
  171.   pp_uint64 llmult = c64_to_ll() * c.c64_to_ll();
  172.   return ll_to_c64(llmult);
  173. }
  174. //------------[ Counter64::operator/(const Counter64 &c) ]--------------
  175. // divide two Counter64s
  176. Counter64 Counter64::operator/(const Counter64 &c) const
  177. {
  178.   pp_uint64 lldiv = c64_to_ll() / c.c64_to_ll();
  179.   return ll_to_c64(lldiv);
  180. }
  181. //-------[ overloaded equivlence test ]----------------------------------
  182. bool operator==(const Counter64 &lhs, const Counter64 &rhs)
  183. {
  184.   return ((lhs.high() == rhs.high()) && (lhs.low() == rhs.low()));
  185. }
  186. //-------[ overloaded not equal test ]-----------------------------------
  187. bool operator!=(const Counter64 &lhs, const Counter64 &rhs)
  188. {
  189.   return ((lhs.high() != rhs.high()) || (lhs.low() != rhs.low()));
  190. }
  191. //--------[ overloaded less than ]---------------------------------------
  192. bool operator<(const Counter64 &lhs, const Counter64 &rhs)
  193. {
  194.   return ( (lhs.high() < rhs.high()) ||
  195.    ((lhs.high() == rhs.high()) && (lhs.low() < rhs.low())));
  196. }
  197. //---------[ overloaded less than or equal ]-----------------------------
  198. bool operator<=(const Counter64 &lhs, const Counter64 &rhs)
  199. {
  200.   return ( (lhs.high() < rhs.high()) ||
  201.    ((lhs.high() == rhs.high()) && (lhs.low() <= rhs.low())));
  202. }
  203. //---------[ overloaded greater than ]-----------------------------------
  204. bool operator>(const Counter64 &lhs, const Counter64 &rhs)
  205. {
  206.   return ( (lhs.high() > rhs.high()) ||
  207.    ((lhs.high() == rhs.high()) && (lhs.low() > rhs.low())));
  208. }
  209. //----------[ overloaded greater than or equal ]-------------------------
  210. bool operator>=(const Counter64 &lhs, const Counter64 &rhs)
  211. {
  212.   return ( (lhs.high() > rhs.high()) ||
  213.    ((lhs.high() == rhs.high()) && (lhs.low() >= rhs.low())));
  214. }
  215. //----------[ return ASCII format ]-------------------------
  216. // TODO:  Fix up to do real 64bit decimal value printing...
  217. //        For now, print > 32-bit values in hex
  218. // 26Nov2002 M.Evstiounin - this method is not thread safe!
  219. const char *Counter64::get_printable() const
  220. {
  221.   if (m_changed == false)
  222.     return output_buffer;
  223.   char *buf = PP_CONST_CAST(char*, output_buffer);
  224.   if ( high() != 0 )
  225.     sprintf(buf, "0x%lX%08lX", high(), low());
  226.   else
  227.     sprintf(buf, "%lu", low());
  228.   Counter64 *nc_this = PP_CONST_CAST(Counter64*, this);
  229.   nc_this->m_changed = false;
  230.   return output_buffer;
  231. }
  232. //----------------[ general Value = operator ]---------------------
  233. SnmpSyntax& Counter64::operator=(const SnmpSyntax &val)
  234. {
  235.   if (this == &val) return *this;  // protect against assignment from itself
  236.   smival.value.hNumber.lopart = 0; // pessimsitic - assume no mapping
  237.   smival.value.hNumber.hipart = 0;
  238.   // try to make assignment valid
  239.   if (val.valid())
  240.   {
  241.     switch (val.get_syntax())
  242.     {
  243.       case sNMP_SYNTAX_CNTR64:
  244. smival.value.hNumber.hipart =
  245. ((Counter64 &)val).smival.value.hNumber.hipart;
  246. smival.value.hNumber.lopart =
  247. ((Counter64 &)val).smival.value.hNumber.lopart;
  248. break;
  249.       case sNMP_SYNTAX_CNTR32:
  250.       case sNMP_SYNTAX_TIMETICKS:
  251.       case sNMP_SYNTAX_GAUGE32:
  252.    // case sNMP_SYNTAX_UINT32: .. indistinguishable from GAUGE32
  253.       case sNMP_SYNTAX_INT32:
  254. // take advantage of union...
  255. smival.value.hNumber.lopart = ((Counter64 &)val).smival.value.uNumber;
  256. smival.value.hNumber.hipart = 0;
  257. break;
  258.     }
  259.   }
  260.   m_changed = true;
  261.   return *this;
  262. }
  263. // Return the space needed for serialization
  264. int Counter64::get_asn1_length() const
  265. {
  266.   if (smival.value.hNumber.hipart == 0)
  267.   {
  268.     if (smival.value.hNumber.lopart < 0x80)
  269.       return 3;
  270.     else if (smival.value.hNumber.lopart < 0x8000)
  271.       return 4;
  272.     else if (smival.value.hNumber.lopart < 0x800000)
  273.       return 5;
  274.     else if (smival.value.hNumber.lopart < 0x80000000)
  275.       return 6;
  276.     return 7;
  277.   }
  278.   if (smival.value.hNumber.hipart < 0x80)
  279.     return 7;
  280.   else if (smival.value.hNumber.hipart < 0x8000)
  281.     return 8;
  282.   else if (smival.value.hNumber.hipart < 0x800000)
  283.     return 9;
  284.   else if (smival.value.hNumber.hipart < 0x80000000)
  285.     return 10;
  286.   return 11;
  287. }
  288. #ifdef SNMP_PP_NAMESPACE
  289. }; // end of namespace Snmp_pp
  290. #endif