// RUN: %llvmgxx %s -c -o /dev/null // PR2917 #include template < int Dim, class T, class EngineTag > class Engine; template < class Subject, class Sub1, bool SV > struct View1Implementation; template < class LayoutTag, class PatchTag > struct MultiPatch; template < class LayoutTag, class PatchTag, int Dim2 > struct MultiPatchView; template < class Engine, class SubDomain > struct NewEngine { }; template < class T > class DomainTraits; template < class DomT, class T, int Dim > struct DomainTraitsDomain { typedef DomT NewDomain1_t; }; template < int Dim > class Interval; template < int Dim > class Loc; template < class DT > class DomainBase { }; template < int Dim, class DT > class Domain:public DomainBase < DT > { }; template < int Dim > struct DomainTraits >:public DomainTraitsDomain < Interval < Dim >, int, Dim > { enum { singleValued = false }; }; template < class T1 > struct NewDomain1 { typedef typename DomainTraits < T1 >::NewDomain1_t SliceType_t; }; template < class Domain, class Sub > struct TemporaryNewDomain1 { typedef typename NewDomain1 < Sub >::SliceType_t SliceType_t; }; template < int Dim > class Interval:public Domain < Dim, DomainTraits < Interval < Dim > > > { }; template < int Dim > class GuardLayers { }; template < class T > class Observer { }; template < class T > class Observable { private:T & observed_m; int count_m; }; class RefCounted { }; template < class T > class RefCountedPtr { public:typedef RefCountedPtr < T > This_t; RefCountedPtr (T * const pT):ptr_m (pT) { } inline T *operator-> () const { } T *ptr_m; }; template < class Dom, class T > class DomainMap { }; template < class LayoutTag, int Dim > struct MultiPatchLayoutTraits { }; template < int Dim > class LayoutBaseData { public:typedef Interval < Dim > Domain_t; Domain_t domain_m; }; template < int Dim, class LBD > class LayoutBase { public:typedef LayoutBaseData < Dim > LayoutData_t; typedef typename LayoutData_t::Domain_t Domain_t; typedef GuardLayers < Dim > GuardLayers_t; inline const Domain_t & domain () const { return pdata_m->domain_m; } inline const Domain_t & innerDomain () const { } inline GuardLayers_t externalGuards () const { } RefCountedPtr < LBD > pdata_m; }; template < class Tag > struct Remote; struct Brick { }; template < class Thing, class Sub > struct View1 { }; template < int Dim, class T, class LayoutTag, class PatchTag > struct NewEngine >, Interval < Dim > > { typedef Engine < Dim, T, MultiPatchView < LayoutTag, PatchTag, Dim > >Type_t; }; template < int Dim, class T, class LayoutTag, class PatchTag, int Dim2 > struct NewEngine >, Interval < Dim > > { typedef Engine < Dim, T, MultiPatchView < LayoutTag, PatchTag, Dim2 > >Type_t; }; template < int Dim, class T, class LayoutTag, class PatchTag > class Engine < Dim, T, MultiPatch < LayoutTag, PatchTag > >:public Observer < typename MultiPatchLayoutTraits < LayoutTag, Dim >::Layout_t > { public:typedef MultiPatch < LayoutTag, PatchTag > Tag_t; typedef Interval < Dim > Domain_t; }; template < int Dim, class T, class LayoutTag, class PatchTag, int Dim2 > class Engine < Dim, T, MultiPatchView < LayoutTag, PatchTag, Dim2 > > { public:typedef MultiPatchView < LayoutTag, PatchTag, Dim2 > Tag_t; typedef Interval < Dim > Domain_t; typedef T Element_t; enum { dimensions = Dim }; }; class Full; template < int Dim, class T = double, class EngineTag = Full > class Vector { }; template < int Dim > inline Interval < Dim > shrinkRight (const Interval < Dim > &dom, int s) { } template < int Dim > class GridLayout; struct GridTag { }; template < int Dim > struct MultiPatchLayoutTraits { typedef GridLayout < Dim > Layout_t; }; template < int Dim > class GridLayoutData:public LayoutBaseData < Dim >, public RefCounted, public Observable < GridLayoutData < Dim > > { typedef int AxisIndex_t; mutable DomainMap < Interval < 1 >, AxisIndex_t > mapAloc_m[Dim]; }; template < int Dim > class GridLayout:public LayoutBase < Dim, GridLayoutData < Dim > >, public Observable < GridLayout < Dim > >, public Observer < GridLayoutData < Dim > > { public:typedef GridLayout < Dim > This_t; GridLayout (); }; template < class MeshTag, class T, class EngineTag > class Field; enum CenteringType { VertexType, EdgeType, FaceType, CellType }; enum ContinuityType { Continuous = 0, Discontinuous }; template < int Dim > class Centering { public:typedef Loc < Dim > Orientation; inline int size () const { } }; template < int Dim > const Centering < Dim > canonicalCentering (const enum CenteringType type, const enum ContinuityType discontinuous, const int dimension = 0); template < class Mesh, class T, class EngineTag > class FieldEngine { public:enum { dimensions = Mesh::dimensions }; enum { Dim = dimensions }; typedef Engine < Dim, T, EngineTag > Engine_t; typedef typename Engine_t::Domain_t Domain_t; typedef GuardLayers < Dim > GuardLayers_t; template < class Layout2 > FieldEngine (const Centering < Dim > ¢ering, const Layout2 & layout, const Mesh & mesh, int materials = 1):num_materials_m (materials), centering_m (centering), stride_m (centering.size ()), physicalCellDomain_m (layout.domain ()), guards_m (layout.externalGuards ()), mesh_m (mesh) { } unsigned int num_materials_m; Centering < Dim > centering_m; int stride_m; Domain_t physicalCellDomain_m; GuardLayers_t guards_m; Mesh mesh_m; }; template < class Subject > class SubFieldView; template < class Mesh, class T, class EngineTag > class SubFieldView < Field < Mesh, T, EngineTag > > { public:typedef Field < Mesh, T, EngineTag > Type_t; }; template < int Dim, class Mesh, class Domain > struct NewMeshTag { typedef Mesh Type_t; }; template < class Mesh, class T, class EngineTag, class Domain > struct View1Implementation , Domain, false > { typedef Field < Mesh, T, EngineTag > Subject_t; typedef typename Subject_t::Engine_t Engine_t; typedef typename NewEngine < Engine_t, Domain >::Type_t NewEngine_t; typedef typename NewEngine_t::Element_t NewT_t; typedef typename NewEngine_t::Tag_t NewEngineTag_t; typedef typename NewMeshTag < NewEngine_t::dimensions, Mesh, Domain >::Type_t NewMeshTag_t; typedef Field < NewMeshTag_t, NewT_t, NewEngineTag_t > Type_t; }; template < class Mesh, class T, class EngineTag, class Sub1 > struct View1 , Sub1 > { typedef Field < Mesh, T, EngineTag > Subject_t; typedef typename Subject_t::Domain_t Domain_t; typedef TemporaryNewDomain1 < Domain_t, Sub1 > NewDomain_t; typedef typename NewDomain_t::SliceType_t SDomain_t; enum { sv = DomainTraits < SDomain_t >::singleValued }; typedef View1Implementation < Subject_t, SDomain_t, sv > Dispatch_t; typedef typename Dispatch_t::Type_t Type_t; }; template < class Mesh, class T = double, class EngineTag = Brick > class Field { public:typedef Mesh MeshTag_t; typedef Mesh Mesh_t; typedef Field < Mesh, T, EngineTag > This_t; typedef FieldEngine < Mesh, T, EngineTag > FieldEngine_t; enum { dimensions = FieldEngine_t::dimensions }; typedef Engine < dimensions, T, EngineTag > Engine_t; typedef typename Engine_t::Domain_t Domain_t; typedef Centering < dimensions > Centering_t; template < class Layout2 > Field (const Centering_t & centering, const Layout2 & layout, const Mesh_t & mesh):fieldEngine_m (centering, layout, mesh) { } inline typename SubFieldView < This_t >::Type_t center (int c) const { } inline typename View1 < This_t, Domain_t >::Type_t all () const { } template < class T1 > const This_t & operator= (const T1 & rhs) const { } private: FieldEngine_t fieldEngine_m; }; struct UniformRectilinearTag { }; struct CartesianTag { }; template < class MeshTraits > struct CartesianURM; template < class MeshTraits > class UniformRectilinearMeshData; template < class MeshTraits > class UniformRectilinearMesh; template < int Dim, typename T = double, class MeshTag = UniformRectilinearTag, class CoordinateSystemTag = CartesianTag, int CDim = Dim > struct MeshTraits; template < int Dim, typename T, class MeshTag, class CoordinateSystemTag, int CDim > struct MeshTraitsBase { typedef MeshTraits < Dim, T, MeshTag, CoordinateSystemTag, CDim > MeshTraits_t; enum { dimensions = Dim }; typedef Vector < CDim, T > PointType_t; }; template < int Dim, typename T, int CDim > struct MeshTraits :public MeshTraitsBase < Dim, T, UniformRectilinearTag, CartesianTag, CDim > { typedef typename MeshTraitsBase < Dim, T, UniformRectilinearTag, CartesianTag, CDim >::MeshTraits_t MeshTraits_t; typedef CartesianURM < MeshTraits_t > CoordinateSystem_t; typedef UniformRectilinearMeshData < MeshTraits_t > MeshData_t; typedef UniformRectilinearMesh < MeshTraits_t > Mesh_t; typedef Vector < CDim, T > SpacingsType_t; }; template < int Dim > class NoMeshData:public RefCounted { public:NoMeshData () { } template < class Layout > explicit NoMeshData (const Layout & layout):physicalVertexDomain_m (layout. innerDomain ()), physicalCellDomain_m (shrinkRight (physicalVertexDomain_m, 1)), totalVertexDomain_m (layout.domain ()), totalCellDomain_m (shrinkRight (totalVertexDomain_m, 1)) { } private:Interval < Dim > physicalVertexDomain_m, physicalCellDomain_m; Interval < Dim > totalVertexDomain_m, totalCellDomain_m; }; template < class MeshTraits > class UniformRectilinearMeshData:public NoMeshData < MeshTraits:: dimensions > { public:typedef typename MeshTraits::MeshData_t MeshData_t; typedef typename MeshTraits::PointType_t PointType_t; typedef typename MeshTraits::SpacingsType_t SpacingsType_t; enum { dimensions = MeshTraits::dimensions }; template < class Layout > UniformRectilinearMeshData (const Layout & layout, const PointType_t & origin, const SpacingsType_t & spacings): NoMeshData < dimensions > (layout), origin_m (origin), spacings_m (spacings) { } private:PointType_t origin_m; SpacingsType_t spacings_m; }; template < class MeshTraits > class UniformRectilinearMesh:public MeshTraits:: CoordinateSystem_t { public:typedef MeshTraits MeshTraits_t; typedef typename MeshTraits::MeshData_t MeshData_t; typedef typename MeshTraits::PointType_t PointType_t; typedef typename MeshTraits::SpacingsType_t SpacingsType_t; enum { dimensions = MeshTraits::dimensions }; template < class Layout > inline UniformRectilinearMesh (const Layout & layout, const PointType_t & origin, const SpacingsType_t & spacings): data_m (new MeshData_t (layout, origin, spacings)) { } private:RefCountedPtr < MeshData_t > data_m; }; template < class MeshTraits > struct GenericURM { }; template < class MeshTraits > struct CartesianURM: public GenericURM < MeshTraits > { }; template < int dim, class MeshTag = UniformRectilinearTag, class CoordinateSystemTag = CartesianTag > struct ParallelTraits { enum { Dim = dim }; typedef GridLayout < dim > Layout_t; typedef MeshTraits < dim, double, MeshTag, CoordinateSystemTag > MeshTraits_t; typedef typename MeshTraits_t::Mesh_t Mesh_t; typedef MultiPatch < GridTag, Remote < Brick > > Engine_t; }; template < class ComputeTraits > struct RhalkTraits: public ComputeTraits { typedef typename ComputeTraits::Mesh_t Mesh_t; typedef typename ComputeTraits::Engine_t Engine_t; enum { Dim = ComputeTraits::Dim }; typedef Centering < Dim > Centering_t; typedef typename Mesh_t::SpacingsType_t Spacings_t; typedef Field < Mesh_t, double, Engine_t > Scalar_t; }; enum { Dim = 3 }; typedef RhalkTraits < ParallelTraits < Dim, UniformRectilinearTag, CartesianTag > > Traits_t; Vector < Dim > origin; Traits_t::Spacings_t spacings; int main (int argc, char **argv) { Traits_t::Layout_t layout; Traits_t::Mesh_t mesh (layout, origin, spacings); Traits_t::Centering_t face = canonicalCentering < Traits_t::Dim > (FaceType, Continuous); Traits_t::Scalar_t v (face, layout, mesh); for (int i = 0; i < Dim; ++i) v.center (i).all () = std::numeric_limits < double >::signaling_NaN (); }