// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com>
//
// Eigen is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// Alternatively, 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.
//
// Eigen 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 Lesser General Public License or the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License and a copy of the GNU General Public License along with
// Eigen. If not, see <http://www.gnu.org/licenses/>.

#ifndef EIGEN_STDLIST_MODULE_H
#define EIGEN_STDLIST_MODULE_H

#include "Core"
#include <list>

#if (defined(_MSC_VER) && defined(_WIN64)) ||                 /* MSVC auto aligns in 64 bit builds */ \
	  (defined(_MSC_VER) && _MSC_VER >= 1600) ||                /* MSVC 2010 ships alignment compatible STL libs */ \
    (defined(_GLIBCXX_VECTOR) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::vector::resize(size_type,const T&). */

	//#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...)
  #include "src/StlSupport/StdList.h"

#else
	
	#include "src/StlSupport/StdList.h"

#endif

#endif // EIGEN_STDLIST_MODULE_H
