/***************************************************************************
 *   Copyright (C) 2005 by Raphael Langerhorst                             *
 *   raphael-langerhorst@gmx.at                                            *
 *                                                                         *
 *   Permission is hereby granted, free of charge, to any person obtaining *
 *   a copy of this software and associated documentation files (the       *
 *   "Software"), to deal in the Software without restriction, including   *
 *   without limitation the rights to use, copy, modify, merge, publish,   *
 *   distribute, sublicense, and/or sell copies of the Software, and to    *
 *   permit persons to whom the Software is furnished to do so, subject to *
 *   the following conditions:                                             *
 *                                                                         *
 *   The above copyright notice and this permission notice shall be        *
 *   included in all copies or substantial portions of the Software.       *
 *                                                                         *
 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
 *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
 *   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR     *
 *   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
 *   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
 *   OTHER DEALINGS IN THE SOFTWARE.                                       *
 ***************************************************************************/

#include "GEnergy.h"

namespace GCS
{

GEnergy::GEnergy()
: Level(0),
  Amount(0),
  Sigma(0)
{
}

GEnergy::GEnergy(double level, double amount, double sigma)
: Level(level),
  Amount(amount),
  Sigma(sigma)
{
}

GEnergy::GEnergy(const GEnergy& original)
: QMutex(),
  Level(original.Level),
  Amount(original.Amount),
  Sigma(original.Sigma)
{
}

GEnergy::~GEnergy()
{
}

double GEnergy::level() const
{
  return Level;
}

double GEnergy::amount() const
{
  return Amount;
}

double GEnergy::sigma() const
{
  return Sigma;
}

void GEnergy::set(double level, double amount, double sigma)
{
  this->Level = level;
  this->Amount = amount;
  this->Sigma = sigma;
}

void GEnergy::set(const GEnergy original)
{
  set(original.Level,original.Amount,original.Sigma);
}

void GEnergy::operator = (const GEnergy& original)
{
  set(original);
}

GEnergy GEnergy::take(double fraction)
{
  if (fraction>1)
    fraction=1;
  double difference = Amount*fraction;
  Amount -= difference;
  return GEnergy(Level,difference,Sigma);
}

void GEnergy::put(const GEnergy& energy)
{
  if (energy.Amount<0)
    return;
    
  double fraction = energy.Amount / (this->Amount + energy.Amount);
  double d_Level = energy.Level - this->Level;
  double d_Sigma = energy.Sigma - this->Sigma;
  
  this->Amount += energy.Amount;
  this->Level += d_Level*fraction;
  
  //@todo: improve sigma addition
  double d_Level_abs = d_Level;
  if (d_Level_abs<0)
    d_Level_abs = -d_Level_abs;
  this->Sigma += (d_Sigma + d_Level_abs)*fraction;
  
  //now the energy is absorbed...
//   energy.Level = this->Level;
//   energy.Amount = 0;
//   energy.Sigma = this->Sigma;
}

}


syntax highlighted by Code2HTML, v. 0.9.1