// Copyright (C) 2000, International Business Machines
// Corporation and others.  All Rights Reserved.
#if defined(_MSC_VER)
// Turn off compiler warning about long names
#  pragma warning(disable:4786)
#endif

#include "CoinHelperFunctions.hpp"
#include "CoinShallowPackedVector.hpp"

//#############################################################################

void
CoinShallowPackedVector::clear()
{
   clearBase();
   indices_ = NULL;
   elements_ = NULL;
   nElements_ = 0;
}

//#############################################################################

CoinShallowPackedVector&
CoinShallowPackedVector::operator=(const CoinPackedVectorBase & x)
{
   if (&x != this) {
      indices_ = x.getIndices();
      elements_ = x.getElements();
      nElements_ = x.getNumElements();
      CoinPackedVectorBase::clearBase();
      CoinPackedVectorBase::copyMaxMinIndex(x);
      try {
	 CoinPackedVectorBase::duplicateIndex();
      }
      catch (CoinError e) {
	 throw CoinError("duplicate index", "operator= from base",
			"CoinShallowPackedVector");
      }
   }
   return *this;
}

//#############################################################################

CoinShallowPackedVector&
CoinShallowPackedVector::operator=(const CoinShallowPackedVector & x)
{
   if (&x != this) {
      indices_ = x.indices_;
      elements_ = x.elements_;
      nElements_ = x.nElements_;
      CoinPackedVectorBase::clearBase();
      CoinPackedVectorBase::copyMaxMinIndex(x);
      try {
	 CoinPackedVectorBase::duplicateIndex();
      }
      catch (CoinError e) {
	 throw CoinError("duplicate index", "operator=",
			"CoinShallowPackedVector");
      }
   }
   return *this;
}

//#############################################################################

void
CoinShallowPackedVector::setVector(int size,
				  const int * inds, const double * elems,
				  bool testForDuplicateIndex)
{
   indices_ = inds;
   elements_ = elems;
   nElements_ = size;
   CoinPackedVectorBase::clearBase();
   try {
      CoinPackedVectorBase::setTestForDuplicateIndex(testForDuplicateIndex);
   }
   catch (CoinError e) {
      throw CoinError("duplicate index", "setVector",
		     "CoinShallowPackedVector");
   }
}

//#############################################################################

//-------------------------------------------------------------------
// Default
//-------------------------------------------------------------------
CoinShallowPackedVector::CoinShallowPackedVector(bool testForDuplicateIndex) :
   CoinPackedVectorBase(),
   indices_(NULL),
   elements_(NULL),
   nElements_(0)
{
   try {
      CoinPackedVectorBase::setTestForDuplicateIndex(testForDuplicateIndex);
   }
   catch (CoinError e) {
      throw CoinError("duplicate index", "default constructor",
		     "CoinShallowPackedVector");
   }
}
   
//-------------------------------------------------------------------
// Explicit
//-------------------------------------------------------------------
CoinShallowPackedVector::CoinShallowPackedVector(int size, 
					       const int * inds,
					       const double * elems,
					       bool testForDuplicateIndex) :
   CoinPackedVectorBase(),
   indices_(inds),
   elements_(elems),
   nElements_(size)
{
   try {
      CoinPackedVectorBase::setTestForDuplicateIndex(testForDuplicateIndex);
   }
   catch (CoinError e) {
      throw CoinError("duplicate index", "explicit constructor",
		     "CoinShallowPackedVector");
   }
}

//-------------------------------------------------------------------
// Copy
//-------------------------------------------------------------------
CoinShallowPackedVector::CoinShallowPackedVector(const CoinPackedVectorBase& x) :
   CoinPackedVectorBase(),
   indices_(x.getIndices()),
   elements_(x.getElements()),
   nElements_(x.getNumElements())
{
   CoinPackedVectorBase::copyMaxMinIndex(x);
   try {
      CoinPackedVectorBase::setTestForDuplicateIndex(x.testForDuplicateIndex());
   }
   catch (CoinError e) {
      throw CoinError("duplicate index", "copy constructor from base",
		     "CoinShallowPackedVector");
   }
}

//-------------------------------------------------------------------
// Copy
//-------------------------------------------------------------------
CoinShallowPackedVector::CoinShallowPackedVector(const
					       CoinShallowPackedVector& x) :
   CoinPackedVectorBase(),
   indices_(x.getIndices()),
   elements_(x.getElements()),
   nElements_(x.getNumElements())
{
   CoinPackedVectorBase::copyMaxMinIndex(x);
   try {
      CoinPackedVectorBase::setTestForDuplicateIndex(x.testForDuplicateIndex());
   }
   catch (CoinError e) {
      throw CoinError("duplicate index", "copy constructor",
		     "CoinShallowPackedVector");
   }
}

//-------------------------------------------------------------------
// Print
//-------------------------------------------------------------------
void CoinShallowPackedVector::print()
{
for (int i=0; i < nElements_; i++)
  {
  std::cout << indices_[i] << ":" << elements_[i];
  if (i < nElements_-1)
    std::cout << ", ";
  }
 std::cout << std::endl;
}

