/***************************************************************************
                          tnlMeshEntitiesTraits.h  -  description
                             -------------------
    begin                : Feb 13, 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 TNLMESHENTITIESTRAITS_H_
#define TNLMESHENTITIESTRAITS_H_

#include <core/arrays/tnlArray.h>
#include <core/arrays/tnlConstSharedArray.h>
#include <core/tnlIndexedSet.h>
#include <mesh/traits/tnlMeshEntitiesTag.h>
#include <mesh/config/tnlMeshConfigBase.h>
#include <mesh/tnlMeshEntityKey.h>
#include <mesh/tnlMeshEntitySeed.h>

template< typename ConfigTag,
          typename DimensionsTag >
class tnlMeshEntitiesTraits
{   
   /*enum { storageEnabled = tnlMeshEntityStorage< ConfigTag,
                                                 DimensionsTag::value>::enabled };*/
   static const bool storageEnabled = ConfigTag::entityStorage( DimensionsTag::value );

   typedef typename ConfigTag::GlobalIndexType                    GlobalIndexType;
   typedef typename ConfigTag::LocalIndexType                     LocalIndexType;
   typedef typename tnlMeshEntitiesTag< ConfigTag,
                                        DimensionsTag >::Tag      EntityTag;
   typedef tnlMeshEntityKey< ConfigTag, EntityTag >               Key;

   public:

   typedef EntityTag                                              Tag;
   typedef tnlMeshEntity< ConfigTag, Tag >                        Type;
   typedef tnlMeshEntitySeed< ConfigTag, EntityTag >              SeedType;

   typedef tnlStorageTraits< storageEnabled >                     EntityStorageTag;

   typedef tnlArray< Type, tnlHost, GlobalIndexType >             ContainerType;
   typedef tnlSharedArray< Type, tnlHost, GlobalIndexType >       SharedContainerType;
   typedef tnlIndexedSet< Type, GlobalIndexType, Key >            UniqueContainerType;

   typedef tnlConstSharedArray< Type, tnlHost, GlobalIndexType >  SharedArrayType;
};


#endif /* TNLMESHENTITIESTRAITS_H_ */