/***************************************************************************
                          tnlMeshTraits.h  -  description
                             -------------------
    begin                : Feb 11, 2014
    copyright            : (C) 2014 by Tomas Oberhuber
    email                : tomas.oberhuber@fjfi.cvut.cz
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program 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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef TNLMESHTRAITS_H_
#define TNLMESHTRAITS_H_

#include <core/vectors/tnlStaticVector.h>
#include <core/arrays/tnlArray.h>
#include <mesh/tnlDimensionsTag.h>

template< typename ConfigTag,
          typename EntityTag >
class tnlMeshEntity;

template< typename MeshConfig,
          typename Device = tnlHost >
class tnlMeshTraits
{
   public:
      
      static const int meshDimensions = MeshConfig::CellType::dimensions;
      static const int worldDimensions = MeshConfig::worldDimensions;
      
      typedef tnlDimensionsTag< meshDimensions >                                   DimensionsTag;

      typedef Device                                                               DeviceType;
      typedef typename MeshConfig::GlobalIndexType                                 GlobalIndexType;
	   typedef typename MeshConfig::LocalIndexType                                  LocalIndexType;      
      
      typedef tnlStaticVector< worldDimensions, typename MeshConfig::RealType >    PointType;
      typedef tnlMeshEntity< MeshConfig, typename MeshConfig::CellType >           CellType;
      typedef typename CellType::SeedType                                          CellSeedType;
      
      typedef tnlArray< PointType, tnlHost, GlobalIndexType >                      PointArrayType;
	   typedef tnlArray< CellSeedType, tnlHost, GlobalIndexType >                   CellSeedArrayType;
};


#endif /* TNLMESHTRAITS_H_ */