tracedvar.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1997 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the Daedalus Research
  16.  * Group at the University of California Berkeley.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * Contributed by Giao Nguyen, http://daedalus.cs.berkeley.edu/~gnguyen
  34.  */
  35. #ifndef tracedvar_h
  36. #define tracedvar_h
  37. /*
  38.  * If TCLCL_USE_STREAM is defined, we pick up
  39.  * the ability to set the formatting precision/width
  40.  * and use streams.
  41.  * This is not compiled in by default since ns doesn't use streams.
  42.  */
  43. class ostrstream;
  44. class TclObject;
  45. class TracedVar {
  46. public:
  47. TracedVar();
  48. virtual ~TracedVar() {}
  49. virtual char* value(char* buf, int buflen) = 0;
  50. inline const char* name() { return (name_); }
  51. inline void name(const char* name) { name_ = name; }
  52. inline TclObject* owner() { return owner_; }
  53. inline void owner(TclObject* o) { owner_ = o; }
  54. inline TclObject* tracer() { return tracer_; }
  55. inline void tracer(TclObject* o) { tracer_ = o; }
  56. #ifdef TCLCL_USE_STREAM
  57. inline void width(int n) { iosWidth_ = n; }
  58. inline short iosMask() { return iosMask_; }
  59. inline void setf(short val) { iosMask_ |= val; }
  60. inline void setf(short val, short mask) {
  61. iosMask_ = (iosMask_ & ~mask) | (val & mask);
  62. }
  63. #endif /* TCLCL_USE_STREAM */
  64. protected:
  65. TracedVar(const char* name);
  66. #ifdef TCLCL_USE_STREAM
  67. inline void format(ostrstream& os);
  68. #endif /* TCLCL_USE_STREAM */
  69. const char* name_; // name of the variable
  70. TclObject* owner_; // the object that owns this variable
  71. TclObject* tracer_; // callback when the variable is changed
  72. #ifdef TCLCL_USE_STREAM
  73. unsigned char iosWidth_; // ios format width
  74. unsigned char iosPrecision_; // ios format precision
  75. short iosMask_; // ios flag for setf
  76. #endif /* TCLCL_USE_STREAM */
  77. public:
  78. TracedVar* next_; // to make a link list
  79. };
  80. class TracedInt : public TracedVar {
  81. public:
  82. TracedInt() : TracedVar() {}
  83. TracedInt(int v) : TracedVar(), val_(v) {}
  84. virtual ~TracedInt() {}
  85. // implicit conversion operators
  86. inline operator int() { return val_; }
  87. // unary operators
  88. inline int operator++() { assign(val_ + 1); return val_; }
  89. inline int operator--() { assign(val_ - 1); return val_; }
  90. inline int operator++(int) {
  91. int v = val_;
  92. assign(v + 1);
  93. return v;
  94. }
  95. inline int operator--(int) {
  96. int v = val_;
  97. assign(v - 1);
  98. return v;
  99. }
  100. // assignment operators
  101. inline TracedInt& operator=(const TracedInt& v) {
  102. assign(v.val_);
  103. return (*this);
  104. }
  105. inline int operator=(int v) { assign(v); return val_; }
  106. inline int operator+=(int v) { return operator=(val_ + v); }
  107. inline int operator-=(int v) { return operator=(val_ - v); }
  108. inline int operator*=(int v) { return operator=(val_ * v); }
  109. inline int operator/=(int v) { return operator=(val_ / v); }
  110. inline int operator%=(int v) { return operator=(val_ % v); }
  111. inline int operator<<=(int v) { return operator=(val_ << v); }
  112. inline int operator>>=(int v) { return operator=(val_ >> v); }
  113. inline int operator&=(int v) { return operator=(val_ & v); }
  114. inline int operator|=(int v) { return operator=(val_ | v); }
  115. inline int operator^=(int v) { return operator=(val_ ^ v); }
  116. virtual char* value(char* buf, int buflen);
  117. protected:
  118. virtual void assign(const int newval);
  119. int val_; // value stored by this trace variable
  120. };
  121. class TracedDouble : public TracedVar {
  122. public:
  123. TracedDouble() : TracedVar() {}
  124. TracedDouble(double v) : TracedVar(), val_(v) {
  125. #ifdef TCLCL_USE_STREAM
  126. iosPrecision_ = 6;
  127. #endif /* TCLCL_USE_STREAM */
  128. }
  129. virtual ~TracedDouble() {}
  130. inline operator double() { return val_; }
  131. inline double operator++() { assign(val_ + 1); return val_; }
  132. inline double operator--() { assign(val_ - 1); return val_; }
  133. inline double operator++(int) { 
  134. double v = val_;
  135. assign(v + 1);
  136. return v;
  137. }
  138. inline double operator--(int) {
  139. double v = val_;
  140. assign(v - 1);
  141. return v;
  142. }
  143. inline TracedDouble& operator=(const TracedDouble& v) {
  144. assign(v.val_);
  145. return (*this);
  146. }
  147. inline double operator=(double v) { assign(v); return val_; }
  148. inline double operator+=(double v) { return operator=(val_ + v); }
  149. inline double operator-=(double v) { return operator=(val_ - v); }
  150. inline double operator*=(double v) { return operator=(val_ * v); }
  151. inline double operator/=(double v) { return operator=(val_ / v); }
  152. #ifdef TCLCL_USE_STREAM
  153. inline void precision(int n) { iosPrecision_ = n; }
  154. #endif /* TCLCL_USE_STREAM */
  155. virtual char* value(char* buf, int buflen);
  156. protected:
  157. virtual void assign(const double newval);
  158. double val_; // value stored by this trace variable
  159. };
  160. #endif