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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1996 Regents of the University of California.
  4.  * All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  *  This product includes software developed by the MASH Research
  17.  *  Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  * 
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. #ifndef lint
  35. static const char rcsid[] =
  36.     "@(#) $Header: /cvsroot/nsnam/ns-2/tools/integrator.cc,v 1.8 1998/06/27 01:23:57 gnguyen Exp $";
  37. #endif
  38. #include <stdlib.h>
  39. #include "integrator.h"
  40. static class IntegratorClass : public TclClass {
  41.  public:
  42. IntegratorClass() : TclClass("Integrator") {}
  43. TclObject* create(int, const char*const*) {
  44. return (new Integrator);
  45. }
  46. } integrator_class;
  47. Integrator::Integrator() : lastx_(0.), lasty_(0.), sum_(0.)
  48. {
  49. bind("lastx_", &lastx_);
  50. bind("lasty_", &lasty_);
  51. bind("sum_", &sum_);
  52. }
  53. void Integrator::set(double x, double y)
  54. {
  55. lastx_ = x;
  56. lasty_ = y;
  57. sum_ = 0.;
  58. }
  59. void Integrator::newPoint(double x, double y)
  60. {
  61. sum_ += (x - lastx_) * lasty_;
  62. lastx_ = x;
  63. lasty_ = y;
  64. }
  65. int Integrator::command(int argc, const char*const* argv)
  66. {
  67. if (argc == 2) {
  68. if (strcmp(argv[1], "reset") == 0) {
  69. set(0., 0.);
  70. return (TCL_OK);
  71. }
  72. } else if (argc == 4) {
  73. if (strcmp(argv[1], "newpoint") == 0) {
  74. double x = atof(argv[2]);
  75. double y = atof(argv[3]);
  76. newPoint(x, y);
  77. return (TCL_OK);
  78. }
  79. }
  80. return (TclObject::command(argc, argv));
  81. }
  82. /*
  83.  * interface for the 'Samples' class, will probably want to move
  84.  * to some sort of "stats" file at some point
  85.  */
  86. static class SamplesClass : public TclClass {
  87.  public:
  88. SamplesClass() : TclClass("Samples") {}
  89. TclObject* create(int, const char*const*) {
  90. return (new Samples);
  91. }
  92. } samples_class;
  93. int Samples::command(int argc, const char*const* argv)
  94. {
  95. if (argc == 2) {
  96. if (strcmp(argv[1], "mean") == 0) {
  97. if (cnt_ > 0) {
  98. Tcl::instance().resultf("%g", mean());
  99. return (TCL_OK);
  100. }
  101. Tcl::instance().resultf("tried to take mean with no sample points");
  102. return (TCL_ERROR);
  103. }
  104. if (strcmp(argv[1], "cnt") == 0) {
  105. Tcl::instance().resultf("%u", cnt());
  106. return (TCL_OK);
  107. }
  108. if (strcmp(argv[1], "variance") == 0) {
  109. if (cnt_ == 1) {
  110. Tcl::instance().resultf("0.0");
  111. return (TCL_OK);
  112. }
  113. if (cnt_ > 2) {
  114. Tcl::instance().resultf("%g", variance());
  115. return (TCL_OK);
  116. }
  117. return (TCL_ERROR);
  118. }
  119. if (strcmp(argv[1], "reset") == 0) {
  120. reset();
  121. return (TCL_OK);
  122. }
  123. } else if ( argc == 3 ) {
  124. if ( strcmp(argv[1],"newpoint") == 0 ) {
  125. double x = atof(argv[2]);
  126. newPoint(x);
  127. return (TCL_OK);
  128. }
  129. }
  130. return (TclObject::command(argc, argv));
  131. }