/*
 * Project: MoleCuilder
 * Description: creates and alters molecular systems
 * Copyright (C)  2016 Frederik Heber. All rights reserved.
 *
 *
 *   This file is part of MoleCuilder.
 *
 *    MoleCuilder is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation, either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    MoleCuilder is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with MoleCuilder.  If not, see .
 */
/*
 * detail.cpp
 *
 *  Created on: Jun 12, 2016
 *      Author: heber
 */
// include config.h
#ifdef HAVE_CONFIG_H
#include 
#endif
#include "CodePatterns/MemDebug.hpp"
#include "Fragmentation/Summation/SetValues/detail.hpp"
#include "CodePatterns/Assert.hpp"
namespace detail {
// static member variables
const size_t force::FixedSize = 3;
const force::vector_t force::nullvector( force::FixedSize, 0.);
force::force(const vector_t &_components) :
    std::vector(_components)
{
  ASSERT( _components.size() == FixedSize,
      "force::force() - we do not have "+toString(FixedSize)
      +" in given components "+toString(_components));
}
force::force(const double &_c1, const double &_c2, const double &_c3) :
        std::vector(FixedSize, 0.)
{
  operator[](0) = _c1;
  operator[](1) = _c2;
  operator[](2) = _c3;
}
force& force::operator()(const double &_c1, const double &_c2, const double &_c3)
{
  operator[](0) = _c1;
  operator[](1) = _c2;
  operator[](2) = _c3;
  return *this;
}
force& force::operator()(const vector_t &_components)
{
  ASSERT( _components.size() == FixedSize,
      "force::operator() - we do not have "+toString(FixedSize)
      +" in given components "+toString(_components));
  static_cast(*this) = _components;
  return *this;
}
force& force::operator+=(const vector_t &_components)
{
  ASSERT( _components.size() == FixedSize,
      "force::operator+=() - we do not have "+toString(FixedSize)
      +" in given components "+toString(_components));
  operator[](0) += _components[0];
  operator[](1) += _components[1];
  operator[](2) += _components[2];
  return *this;
}
force& force::operator-=(const vector_t &_components)
{
  ASSERT( _components.size() == FixedSize,
      "force::operator-=() - we do not have "+toString(FixedSize)
      +" in given components "+toString(_components));
  operator[](0) -= _components[0];
  operator[](1) -= _components[1];
  operator[](2) -= _components[2];
  return *this;
}
void force::superposeOtherIndexedVectors(const force &other, const double prefactor)
{
  ASSERT( other.size() == FixedSize,
      "force::superposeOtherIndexedVectors() - vector to other instance has size "
      +toString(other.size())+" different to FixedSize "
      +toString(FixedSize)+".");
  vector_t::iterator vectoriter = begin();
  vector_t::const_iterator othervectoriter = other.begin();
  for (;vectoriter != end(); ++vectoriter, ++othervectoriter) {
    *vectoriter += prefactor * (*othervectoriter);
  }
}
}; /* end namespace detail */