| File: System\Xaml\Schema\TypeBits.cs | Web Access |
| Project: src\wpf\src\Microsoft.DotNet.Wpf\src\System.Xaml\System.Xaml.csproj (System.Xaml) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #nullable disable using System.Threading; namespace System.Xaml { // list of the different kinds of "built-in" type functionality // recognized by the XAML language system. [Flags] internal enum BoolTypeBits { Constructible = 0x0001, XmlData = 0x0002, MarkupExtension = 0x0004, Nullable = 0x0008, NameScope = 0x0010, ConstructionRequiresArguments = 0x0020, Public = 0x0040, Unknown = 0x0100, TrimSurroundingWhitespace = 0x1000, WhitespaceSignificantCollection = 0x2000, UsableDuringInitialization = 0x4000, Ambient = 0x8000, Default = Constructible | Nullable | Public, AllValid = 0xFFFF << 16 } [Flags] internal enum BoolMemberBits { ReadOnly = 0x0001, WriteOnly = 0x0002, Event = 0x0004, Unknown = 0x0008, Ambient = 0x0010, ReadPublic = 0x0020, WritePublic = 0x0040, Default = ReadPublic | WritePublic, Directive = Default, AllValid = 0xFFFF << 16 } // Use this instead of a Nullable<bool> when a single-word read is needed for thread safety internal enum ThreeValuedBool : byte { NotSet, False, True } // Thread safety: it's important that this structure remain word-sized, so that reads and // writes to it are atomic internal struct NullableReference<T> where T : class { private static object s_NullSentinel = new object(); private static object s_NotPresentSentinel = new object(); private object _value; public bool IsNotPresent { get { return ReferenceEquals(_value, s_NotPresentSentinel); } set { _value = value ? s_NotPresentSentinel : null; } } public bool IsSet { get { return !(_value is null); } } public bool IsSetVolatile { get { object value = Volatile.Read(ref _value); return !(value is null); } } public T Value { get { object value = _value; return ReferenceEquals(value, s_NullSentinel) ? null : (T)value; } set { _value = value is null ? s_NullSentinel : value; } } public void SetIfNull(T value) { object newValue = value is null ? s_NullSentinel : value; Interlocked.CompareExchange(ref _value, newValue, null); } public void SetVolatile(T value) { object newValue = value is null ? s_NullSentinel : value; Volatile.Write(ref _value, newValue); } } }