mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 00:16:48 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58389 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			490 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			490 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // RUN: %llvmgxx %s -c -o /dev/null
 | |
| // PR2917
 | |
| 
 | |
| #include <complex>
 | |
| 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 <Interval < Dim >
 | |
|   >: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 <Engine < Dim, T, MultiPatch < LayoutTag,
 | |
|   PatchTag > >, 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 <Engine < Dim, T, MultiPatchView < LayoutTag,
 | |
|   PatchTag, Dim2 > >, 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 <GridTag, Dim >
 | |
| {
 | |
|   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 <Field < Mesh, T, EngineTag >,
 | |
|   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 <Field < Mesh, T, EngineTag >, 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 <Dim, T,
 | |
|   UniformRectilinearTag, CartesianTag, CDim >: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 ();
 | |
| }
 |