Example #1
0
		public static Clang.Ast.Type CleanType(QualType qt)
		{
			var et = qt.Type as ElaboratedType;
			if (et == null)
				return qt.Type;
			return et.UnqualifiedDesugaredType;
		}
Example #2
0
        public static bool TryParse(string text, out QualType result)
        {
            if (text.Match(Keywords.w_NONE))
            {
                result = QualType.NONE;
            }
            else if (text.Match(Keywords.w_CHEM))
            {
                result = QualType.CHEM;
            }
            else if (text.Match(Keywords.w_AGE))
            {
                result = QualType.AGE;
            }
            else if (text.Match(Keywords.w_TRACE))
            {
                result = QualType.TRACE;
            }
            else
            {
                result = (QualType)(-1);
                return(false);
            }

            return(true);
        }
Example #3
0
        bool IsExtVector(Decl decl, QualType type, ref string simd_type)
        {
            var rv = false;
            var t  = type.CanonicalQualType.Type;

            // Unpoint the type
            var pointerType = t as Clang.Ast.PointerType;

            if (pointerType != null)
            {
                t = pointerType.PointeeQualType.Type;
            }

            if (t.Kind == TypeKind.ExtVector)
            {
                rv = true;
            }
            else
            {
                var r = (t as RecordType)?.Decl;
                if (r != null)
                {
                    foreach (var f in r.Fields)
                    {
                        var qt = f.QualType.CanonicalQualType.Type;
                        if (qt.Kind == TypeKind.ExtVector)
                        {
                            rv = true;
                            break;
                        }
                        var at = qt as ConstantArrayType;
                        if (at != null)
                        {
                            if (at.ElementType.Type.Kind == TypeKind.ExtVector)
                            {
                                rv = true;
                                break;
                            }
                        }
                    }
                }
            }

            var typeName = type.ToString();

            if (!rv && typeName.Contains("simd"))
            {
                var framework = Helpers.GetFramework(decl);
                Log.On(framework).Add($"!unknown-simd-type! Could not detect that {typeName} is a Simd type, but its name contains 'simd'. Something needs fixing in SimdCheck.cs");
            }

            if (rv)
            {
                simd_type = typeName;
            }

            return(rv);
        }
Example #4
0
		public static string CleanTypeCplusplus(QualType qt)
		{
			var s = CleanType(qt).ToString();
			if (s == "_Bool")
				return "bool";

			// Ok, I want to click on that blue thing and use the action, the "1"//
			if (s.IndexOf("_Bool") != -1)
				Console.WriteLine("f");
			if (s.StartsWith("class ")) {
				s = s.Substring(6);
				return s;
			}
			if (s.StartsWith("struct "))
				return s.Substring(7);

			return s;
		}
Example #5
0
        bool IsSimdType(QualType type, ref string simd_type, ref bool requires_marshal_directive)
        {
            var str = Undecorate(type.ToString());

            if (type_mapping.TryGetValue(str, out var info))
            {
                requires_marshal_directive = true;
                simd_type = str;
                return(true);
            }

            if (IsExtVector(type, ref simd_type))
            {
                Console.WriteLine($"!unknown-simd-type-mapping! The Simd type {simd_type} does not have a mapping to a managed type. Please add one in SimdCheck.cs");
            }

            return(false);
        }
Example #6
0
        bool IsSimdType(Decl decl, QualType type, ref string simd_type, ref bool requires_marshal_directive)
        {
            var str = Undecorate(type.ToString());

            if (type_mapping.TryGetValue(str, out var info))
            {
                requires_marshal_directive = true;
                simd_type = str;
                return(true);
            }

            if (IsExtVector(decl, type, ref simd_type))
            {
                var framework = Helpers.GetFramework(decl);
                Log.On(framework).Add($"!unknown-simd-type-mapping! The Simd type {simd_type} does not have a mapping to a managed type. Please add one in SimdCheck.cs");
            }

            return(false);
        }
Example #7
0
		// 
		// Given a Clang QualType, returns the AstType to use to marshal, both for the 
		// P/Invoke signature and for the high level binding
		//
		// Handles RefCounted objects that we wrap
		//
		void LookupMarshalTypes(QualType qt, 
		                        out AstType lowLevel, out ICSharpCode.NRefactory.CSharp.ParameterModifier lowLevelParameterMod, 
		                        out AstType highLevel, out ICSharpCode.NRefactory.CSharp.ParameterModifier highLevelParameterMod, 
		                        out WrapKind wrapKind, bool isReturn = false)
		{
			wrapKind = WrapKind.None;
			lowLevelParameterMod = ICSharpCode.NRefactory.CSharp.ParameterModifier.None;
			highLevelParameterMod = ICSharpCode.NRefactory.CSharp.ParameterModifier.None;

			var cleanType = CleanType(qt);
			var cleanTypeStr = cleanType.ToString();

			switch (cleanTypeStr) {
			case "const char *":
				lowLevel = new PrimitiveType("string");
				highLevel = new PrimitiveType("string");
				return;
			case "ThreadID":
			// Troublesome because on windows it is a sizeof(unsigned), on unix sizeof(pthread_t), which is 
			// 32 or 64 bits.
			case "void *":
				lowLevel = new PrimitiveType("IntPtr");
				highLevel = new PrimitiveType("IntPtr");
				return;

			case "const Urho3D::String &":
			case "class Urho3D::String":
			case ConstStringReference:
				if (isReturn) {
					lowLevel = new PrimitiveType("IntPtr");
					highLevel = new PrimitiveType("string");
					wrapKind = WrapKind.MarshalPtrToString;
					return;
				} else {
					lowLevel = new PrimitiveType("string");
					highLevel = new PrimitiveType("string");
					return;
				}
			case "const class Urho3D::Vector2 &":
			case "const class Urho3D::Vector3 &":
			case "const class Urho3D::Vector4 &":
			case "const class Urho3D::Quaternion &":
			case "const class Urho3D::Plane &":
			case "const class Urho3D::BoundingBox &":
			case "const class Urho3D::Color &":
			case "const class Urho3D::IntVector2 &":
			case "const class Urho3D::IntRect &":
			case "const struct Urho3D::TileMapInfo2D &":
			case "const class Urho3D::XMLElement &":
			case "class Urho3D::XMLElement &":
			case "const class Urho3D::Ray &":
				var simpleType = RemapTypeToNamespace (cleanTypeStr.DropConstAndReference().DropClassOrStructPrefix().DropUrhoNamespace().RemapAcronyms());
				highLevel = new SimpleType (simpleType);
				lowLevel = new SimpleType (simpleType);
				lowLevelParameterMod = ICSharpCode.NRefactory.CSharp.ParameterModifier.Ref;
				wrapKind = WrapKind.RefBlittable;
				return;
			case "struct Urho3D::PhysicsRaycastResult &":
				lowLevelParameterMod = ICSharpCode.NRefactory.CSharp.ParameterModifier.Ref;
				highLevelParameterMod = ICSharpCode.NRefactory.CSharp.ParameterModifier.Ref;
				highLevel = new SimpleType ("PhysicsRaycastResult");
				lowLevel = new SimpleType ("PhysicsRaycastResult");
				wrapKind = WrapKind.RefBlittable;
				return;
			case "const struct Urho3D::CrowdObstacleAvoidanceParams &":
				lowLevelParameterMod = ICSharpCode.NRefactory.CSharp.ParameterModifier.Ref;
				highLevel = new SimpleType ("CrowdObstacleAvoidanceParams");
				lowLevel = new SimpleType ("CrowdObstacleAvoidanceParams");
				wrapKind = WrapKind.RefBlittable;
				return;
			case "const struct Urho3D::BiasParameters &":
				lowLevelParameterMod = ICSharpCode.NRefactory.CSharp.ParameterModifier.Ref;
				highLevel = new SimpleType ("BiasParameters");
				lowLevel = new SimpleType ("BiasParameters");
				wrapKind = WrapKind.RefBlittable;
				return;
			case "const struct Urho3D::CascadeParameters &":
				lowLevelParameterMod = ICSharpCode.NRefactory.CSharp.ParameterModifier.Ref;
				highLevel = new SimpleType ("CascadeParameters");
				lowLevel = new SimpleType ("CascadeParameters");
				wrapKind = WrapKind.RefBlittable;
				return;
			case "class Urho3D::Serializer &":
			case "class Urho3D::Deserializer &":
				highLevel = new SimpleType ("File");
				lowLevel = new SimpleType ("IntPtr");
				wrapKind = WrapKind.HandleMember;
				return;
			case "struct Urho3D::TouchState *":
				if (isReturn)
				{
					lowLevel = new PrimitiveType("IntPtr");
					highLevel = new SimpleType("TouchState");
					wrapKind = WrapKind.MarshalPtrToStruct;
					return;
				}
				break;

				// currently "Vector<X> &" are only supported for return values
			case "const Vector<SharedPtr<class Urho3D::AnimationState> > &":
			case "const Vector<SharedPtr<class Urho3D::Node> > &":
			case "const Vector<SharedPtr<class Urho3D::Component> > &":
			case "const Vector<SharedPtr<class Urho3D::VertexBuffer> > &":
			case "const Vector<SharedPtr<class Urho3D::IndexBuffer> > &":
			case "const Vector<SharedPtr<class Urho3D::UIElement> > &":
			case "const Vector<SharedPtr<class Urho3D::PackageFile> > &":
			case "const Vector<SharedPtr<class Urho3D::Texture2D> > &":
				var sp = cleanTypeStr.IndexOf ("::");
				var ep = cleanTypeStr.IndexOf ("> >");
				string tn = cleanTypeStr.Substring (sp + 2, ep - sp - 2);

				highLevel = csParser.ParseTypeReference ("IReadOnlyList<" + tn + ">");
				lowLevel = new SimpleType ("IntPtr");
				wrapKind = WrapKind.VectorSharedPtr;
				return;
			case "class Urho3D::StringHash":
				highLevel = new SimpleType ("StringHash");
				lowLevel = new PrimitiveType ("int");
				wrapKind = WrapKind.StringHash;
				return;
			default:
				//Console.WriteLine (cleanTypeStr);
				break;
			}

			if (isReturn && cleanTypeStr.Contains("SharedPtr<"))
			{
				string type = cleanTypeStr.ExtractGenericParameter().DropClassOrStructPrefix().DropUrhoNamespace();
				highLevel = new SimpleType(RemapTypeName(type));
				if (cleanTypeStr.Contains("class")) //TODO: inspect underlying type instead
				{
					wrapKind = WrapKind.HandleMember;
					lowLevel = new SimpleType("IntPtr");
				}
				else
				{
					lowLevel = new SimpleType(RemapTypeName(type));
				}
				return;
			}

			if (cleanType.Kind == TypeKind.Pointer) {
				var ptrType = cleanType as PointerType;
				var underlying = GetPointersUnderlyingType(ptrType);

				CXXRecordDecl decl;
				if (underlying != null && ScanBaseTypes.nameToDecl.TryGetValue(underlying.Decl.QualifiedName, out decl)) {
					if (decl.IsDerivedFrom(ScanBaseTypes.UrhoObjectType)) {
						lowLevel = new SimpleType("IntPtr");
						var remapped = RemapTypeName(decl.Name);
						if (remapped != decl.Name)
							highLevel = csParser.ParseTypeReference(RemapTypeToNamespace (remapped));
						else
							highLevel = underlying.Bind();
						wrapKind = WrapKind.UrhoObject;
						return;
					}
					if (decl.IsDerivedFrom(ScanBaseTypes.UrhoRefCounted)) {
						lowLevel = new SimpleType("IntPtr");
						var remapped = RemapTypeName(decl.Name);
						if (remapped != decl.Name)
							highLevel = csParser.ParseTypeReference(RemapTypeToNamespace (remapped));
						else
							highLevel = underlying.Bind();
						wrapKind = WrapKind.HandleMember;
						return;
					}
					if (decl == ScanBaseTypes.EventHandlerType) {
						wrapKind = WrapKind.EventHandler;
						lowLevel = new SimpleType("IntPtr");
						highLevel = new SimpleType("IntPtr");
						return;
					}
					if (decl.Name == "ProfilerBlock") {
						lowLevel = new SimpleType("ProfilerBlock");
						highLevel = new SimpleType("ProfilerBlock");

					}
					if (decl.Name == "Deserializer") {
						lowLevel = new SimpleType("IntPtr");
						highLevel = new SimpleType("IDeserializer");
						wrapKind = WrapKind.HandleMember;
						return;
					}
					if (decl.Name == "Serializer") {
						lowLevel = new SimpleType("IntPtr");
						highLevel = new SimpleType("ISerializer");
						wrapKind = WrapKind.HandleMember;
						return;
					}
				}
			}
			lowLevel = cleanType.Bind();
			highLevel = cleanType.Bind();
		}
Example #8
0
		// Temporary, just to help us get the bindings bootstrapped
		// 
		// This limits which C++ types we can bind, and lets us progressively add more
		static bool IsUnsupportedType(QualType qt, bool returnType = false)
		{
			var ct = CleanType(qt);
			var ctstring = ct.ToString ();

			// String references are hand-bound, so we are going to let those though
			if (ctstring == ConstStringReference || ctstring == "const Urho3D::String &")
				return false;

			switch (ctstring) {
			case "const class Urho3D::Vector3 &":
			case "const class Urho3D::IntRect &":
			case "const class Urho3D::Color &":
			case "const class Urho3D::Vector2 &":
			case "const class Urho3D::Vector4 &":
			case "const class Urho3D::IntVector2 &":
			case "const class Urho3D::Quaternion &":
			case "const class Urho3D::Plane &":
			case "const class Urho3D::BoundingBox &":
			case "const struct Urho3D::BiasParameters &":
			case "const struct Urho3D::CascadeParameters &":
			case "const struct Urho3D::TileMapInfo2D &":
			case "const class Urho3D::XMLElement &":
			case "class Urho3D::XMLElement &":
			case "struct Urho3D::PhysicsRaycastResult &":
			case "const class Urho3D::Ray &":
			case "const struct Urho3D::CrowdObstacleAvoidanceParams &":
			case "class Urho3D::Serializer &":
			case "class Urho3D::Deserializer &":
					return false;
			}

			if (returnType) {
				switch (ctstring) {
				case "const Vector<SharedPtr<class Urho3D::Node> > &":
				case "const Vector<SharedPtr<class Urho3D::Component> > &":
				case "const Vector<SharedPtr<class Urho3D::VertexBuffer> > &":
				case "const Vector<SharedPtr<class Urho3D::IndexBuffer> > &":
				case "const Vector<SharedPtr<class Urho3D::UIElement> > &":
				case "const Vector<SharedPtr<class Urho3D::PackageFile> > &":
				case "const Vector<SharedPtr<class Urho3D::Texture2D> > &":
				case "const Vector<SharedPtr<class Urho3D::AnimationState> > &":
					return false;
				}
#if false
				if (ctstring.Contains ("Vector")) {
					if (!displayed.Contains (ctstring)) {
						Console.WriteLine (ctstring);
						displayed.Add (ctstring);
					}
				}
#endif
			} else {
				// The & at the end is redundant, Urho always uses PODVector & on parameters
				// but there for future proofing.
				if (ctstring.Contains ("PODVector<") && ctstring.EndsWith ("&")) {
					string plainPodClass = StringUtil.DropConstAndReference (ctstring);
					// Now, white list the classes we know about, for now
					// we are going to bind the ones that are UrhoObjects 
					switch (plainPodClass) {
					case "PODVector<class Urho3D::Node *>":
					case "PODVector<class Urho3D::Component *>":
					case "PODVector<class Urho3D::VertexBuffer *>":
					case "PODVector<class Urho3D::RigidBody *>":
					case "PODVector<class Urho3D::RigidBody2d *>":
					case "PODVector<class Urho3D::Resource *>":
						podClasses.Add (plainPodClass);
						break;
					default:
						missingPodClasses.Add (plainPodClass);
						break;
					}
				}
			}

			if (ctstring.StartsWith("SharedPtr<") && returnType)
				return false;

			var s = ct.Bind().ToString();
			if (s.Contains ("unsupported")) {
				return true;
			}

			// Quick hack, just while we get thigns going
			if (s.Contains("EventHandler**")) {
				return true;
			}
			if (s.Contains("b2") || s.Contains ("bt"))
				return true;
			
			// Candidate for a hand binding (Connection.h)
			if (qt.ToString().Contains("kNet::SharedPtr"))
				return true;
			if (s.Contains("XMLElement"))
				return true;
			if (s.Contains ("CollisionGeometryData"))
				return true;
			if (s.Contains ("SDL"))
				return true;
			return false;
		}
Example #9
0
		static bool IsVariantType(QualType qt)
		{
			var ct = CleanType(qt);
			var ctstring = ct.ToString();
			return ctstring == "const class Urho3D::Variant &";
		}
Example #10
0
        ///<summary>Initializes WQ solver system</summary>

        public QualitySim(EpanetNetwork net, TraceSource ignored)
        {
//        this.log = log;
            _net = net;

            _nodes = net.Nodes.Select(QualityNode.Create).ToArray();
            _tanks = _nodes.OfType <QualityTank>().ToArray();
            _juncs = _nodes.Where(x => !(x is QualityTank)).ToArray();
            _links = net.Links.Select(n => new QualityLink(net.Nodes, _nodes, n)).ToArray();


            /*
             * this.nodes = new List<QualityNode>(net.Nodes.Count);
             * this.links = new List<QualityLink>(net.Links.Count);
             * this.tanks = new List<QualityTank>(net.Tanks.Count());
             * this.juncs = new List<QualityNode>(net.Junctions.Count());
             *
             * foreach (Node n in net.Nodes) {
             *  QualityNode qN = QualityNode.Create(n);
             *
             *  this.nodes.Add(qN);
             *
             *  var tank = qN as QualityTank;
             *
             *  if (tank != null)
             *      this.tanks.Add(tank);
             *  else
             *      this.juncs.Add(qN);
             * }
             *
             * foreach (Link n  in  net.Links)
             *  this.links.Add(new QualityLink(net.Nodes, this.nodes, n));
             *
             */

            _bucf      = 1.0;
            _tucf      = 1.0;
            _reactflag = false;

            _qualflag = _net.QualFlag;

            if (_qualflag != QualType.NONE)
            {
                if (_qualflag == QualType.TRACE)
                {
                    foreach (QualityNode qN  in  _nodes)
                    {
                        if (qN.Node.Name.Equals(_net.TraceNode, StringComparison.OrdinalIgnoreCase))
                        {
                            _traceNode         = qN;
                            _traceNode.Quality = 100.0;
                            break;
                        }
                    }
                }

                if (_net.Diffus > 0.0)
                {
                    _sc = _net.Viscos / _net.Diffus;
                }
                else
                {
                    _sc = 0.0;
                }

                _bucf = GetUcf(_net.BulkOrder);
                _tucf = GetUcf(_net.TankOrder);

                _reactflag = GetReactflag();
            }


            _wbulk   = 0.0;
            _wwall   = 0.0;
            _wtank   = 0.0;
            _wsource = 0.0;

            _htime     = 0;
            _rtime     = _net.RStart;
            _qtime     = 0;
            _nperiods  = 0;
            _elevUnits = _net.FieldsMap.GetUnits(FieldType.ELEV);
        }
Example #11
0
        ///<summary>Update fields and units, after loading the INP.</summary>
        public void Prepare(
            UnitsType targetUnits,
            FlowUnitsType flowFlag,
            PressUnitsType pressFlag,
            QualType qualFlag,
            string chemUnits,
            double spGrav,
            long hstep)
        {
            double dcf,
                   ccf,
                   qcf,
                   hcf,
                   pcf,
                   wcf;

            if (targetUnits == UnitsType.SI)
            {
                GetField(FieldType.DEMAND).Units = flowFlag.ToString();
                GetField(FieldType.ELEV).Units   = Keywords.u_METERS;
                GetField(FieldType.HEAD).Units   = Keywords.u_METERS;

                GetField(FieldType.PRESSURE).Units = pressFlag == PressUnitsType.METERS
                    ? Keywords.u_METERS
                    : Keywords.u_KPA;

                GetField(FieldType.LENGTH).Units   = Keywords.u_METERS;
                GetField(FieldType.DIAM).Units     = Keywords.u_MMETERS;
                GetField(FieldType.FLOW).Units     = flowFlag.ToString();
                GetField(FieldType.VELOCITY).Units = Keywords.u_MperSEC;
                GetField(FieldType.HEADLOSS).Units = "m" + Keywords.u_per1000M;
                GetField(FieldType.FRICTION).Units = "";
                GetField(FieldType.POWER).Units    = Keywords.u_KW;

                dcf = 1000.0 * Constants.MperFT;
                qcf = Constants.LPSperCFS;
                if (flowFlag == FlowUnitsType.LPM)
                {
                    qcf = Constants.LPMperCFS;
                }
                if (flowFlag == FlowUnitsType.MLD)
                {
                    qcf = Constants.MLDperCFS;
                }
                if (flowFlag == FlowUnitsType.CMH)
                {
                    qcf = Constants.CMHperCFS;
                }
                if (flowFlag == FlowUnitsType.CMD)
                {
                    qcf = Constants.CMDperCFS;
                }
                hcf = Constants.MperFT;
                if (pressFlag == PressUnitsType.METERS)
                {
                    pcf = Constants.MperFT * spGrav;
                }
                else
                {
                    pcf = Constants.KPAperPSI * Constants.PSIperFT * spGrav;
                }
                wcf = Constants.KWperHP;
            }
            else
            {
                GetField(FieldType.DEMAND).Units = flowFlag.ToString();
                GetField(FieldType.ELEV).Units   = Keywords.u_FEET;
                GetField(FieldType.HEAD).Units   = Keywords.u_FEET;

                GetField(FieldType.PRESSURE).Units = Keywords.u_PSI;
                GetField(FieldType.LENGTH).Units   = Keywords.u_FEET;
                GetField(FieldType.DIAM).Units     = Keywords.u_INCHES;
                GetField(FieldType.FLOW).Units     = flowFlag.ToString();
                GetField(FieldType.VELOCITY).Units = Keywords.u_FTperSEC;
                GetField(FieldType.HEADLOSS).Units = "ft" + Keywords.u_per1000FT;
                GetField(FieldType.FRICTION).Units = "";
                GetField(FieldType.POWER).Units    = Keywords.u_HP;


                dcf = 12.0;
                qcf = 1.0;
                if (flowFlag == FlowUnitsType.GPM)
                {
                    qcf = Constants.GPMperCFS;
                }
                if (flowFlag == FlowUnitsType.MGD)
                {
                    qcf = Constants.MGDperCFS;
                }
                if (flowFlag == FlowUnitsType.IMGD)
                {
                    qcf = Constants.IMGDperCFS;
                }
                if (flowFlag == FlowUnitsType.AFD)
                {
                    qcf = Constants.AFDperCFS;
                }
                hcf = 1.0;
                pcf = Constants.PSIperFT * spGrav;
                wcf = 1.0;
            }

            GetField(FieldType.QUALITY).Units = "";
            ccf = 1.0;

            switch (qualFlag)
            {
            case QualType.CHEM:
                ccf = 1.0 / Constants.LperFT3;
                GetField(FieldType.QUALITY).Units   = chemUnits;
                GetField(FieldType.REACTRATE).Units = chemUnits + Keywords.t_PERDAY;
                break;

            case QualType.AGE:
                GetField(FieldType.QUALITY).Units = Keywords.u_HOURS;
                break;

            case QualType.TRACE:
                GetField(FieldType.QUALITY).Units = Keywords.u_PERCENT;
                break;
            }

            SetUnits(FieldType.DEMAND, qcf);
            SetUnits(FieldType.ELEV, hcf);
            SetUnits(FieldType.HEAD, hcf);
            SetUnits(FieldType.PRESSURE, pcf);
            SetUnits(FieldType.QUALITY, ccf);
            SetUnits(FieldType.LENGTH, hcf);
            SetUnits(FieldType.DIAM, dcf);
            SetUnits(FieldType.FLOW, qcf);
            SetUnits(FieldType.VELOCITY, hcf);
            SetUnits(FieldType.HEADLOSS, hcf);
            SetUnits(FieldType.LINKQUAL, ccf);
            SetUnits(FieldType.REACTRATE, ccf);
            SetUnits(FieldType.FRICTION, 1.0);
            SetUnits(FieldType.POWER, wcf);
            SetUnits(FieldType.VOLUME, hcf * hcf * hcf);

            if (hstep < 1800)
            {
                SetUnits(FieldType.TIME, 1.0 / 60.0);
                GetField(FieldType.TIME).Units = Keywords.u_MINUTES;
            }
            else
            {
                SetUnits(FieldType.TIME, 1.0 / 3600.0);
                GetField(FieldType.TIME).Units = Keywords.u_HOURS;
            }
        }