//===--- KnownProtocols.def - Compiler protocol metaprogramming -*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // This file defines macros used for macro-metaprogramming with compiler-known // protocols. Note that this mechanism does not look through an overlay into its // underlying module, so it typically cannot find Objective-C protocols. // //===----------------------------------------------------------------------===// /// \def PROTOCOL_WITH_NAME(Id, Name) /// /// The enumerator value is \c KnownProtocolKind::Id. The protocol represented /// is simply named \p Name. #ifndef PROTOCOL_WITH_NAME #define PROTOCOL_WITH_NAME(Id, Name) #endif /// \def EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(Id, Name, typeName, performLocalLookup) /// \param typeName supplies the name used for type lookup, /// \param performLocalLookup specifies whether to first look in the local context. #ifndef EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME #define EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(Id, Name, typeName, performLocalLookup) \ PROTOCOL_WITH_NAME(Id, Name) #endif /// \def BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(Id, Name) /// /// Note that this is not a special form of EXPRESSIBLE_BY_LITERAL_PROTOCOL. #ifndef BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME #define BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(Id, Name) \ PROTOCOL_WITH_NAME(Id, Name) #endif /// \def INVERTIBLE_PROTOCOL_WITH_NAME(id, name) /// \param Name a string literal with the external name of this protocol /// \param Id the internal "enum name" of this protocol. #ifndef INVERTIBLE_PROTOCOL_WITH_NAME #define INVERTIBLE_PROTOCOL_WITH_NAME(Id, Name) \ PROTOCOL_WITH_NAME(Id, Name) #endif /// \def REPRESSIBLE_PROTOCOL_WITH_NAME(id, name) /// \param id the internal "enum name" of this protocol /// \param name a string literal with the external name of this protocol #ifndef REPRESSIBLE_PROTOCOL_WITH_NAME #define REPRESSIBLE_PROTOCOL_WITH_NAME(Id, Name) \ PROTOCOL_WITH_NAME(Id, Name) #endif #define REPRESSIBLE_PROTOCOL(name) REPRESSIBLE_PROTOCOL_WITH_NAME(name, #name) #define REPRESSIBLE_PROTOCOL_(name) REPRESSIBLE_PROTOCOL_WITH_NAME(name, "_" #name) #define PROTOCOL(name) PROTOCOL_WITH_NAME(name, #name) #define PROTOCOL_(name) PROTOCOL_WITH_NAME(name, "_" #name) /// \param typeName supplies the name used for type lookup, /// \param performLocalLookup specifies whether to first look in the local context. #define EXPRESSIBLE_BY_LITERAL_PROTOCOL(name, typeName, performLocalLookup) \ EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(name, #name, typeName, performLocalLookup) /// \param typeName supplies the name used for type lookup, /// \param performLocalLookup specifies whether to first look in the local context. #define EXPRESSIBLE_BY_LITERAL_PROTOCOL_(name, typeName, performLocalLookup) \ EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(name, "_" #name, typeName, performLocalLookup) #define BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(name) \ BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(name, "_" #name) PROTOCOL(Actor) PROTOCOL(Sequence) PROTOCOL(Identifiable) PROTOCOL(IteratorProtocol) PROTOCOL(RawRepresentable) PROTOCOL(Equatable) PROTOCOL(Hashable) PROTOCOL(Comparable) PROTOCOL(Error) PROTOCOL_(ErrorCodeProtocol) PROTOCOL(OptionSet) PROTOCOL(CaseIterable) PROTOCOL(SIMD) PROTOCOL(SIMDScalar) PROTOCOL(BinaryInteger) PROTOCOL(FixedWidthInteger) PROTOCOL(RangeReplaceableCollection) PROTOCOL(Executor) PROTOCOL(SerialExecutor) PROTOCOL(TaskExecutor) PROTOCOL(GlobalActor) PROTOCOL(ExecutorFactory) PROTOCOL_(BridgedNSError) PROTOCOL_(BridgedStoredNSError) PROTOCOL_(CFObject) PROTOCOL_(SwiftNewtypeWrapper) PROTOCOL(CodingKey) PROTOCOL(Encodable) PROTOCOL(Decodable) PROTOCOL(Sendable) PROTOCOL(SendableMetatype) PROTOCOL(UnsafeSendable) PROTOCOL_(ObjectiveCBridgeable) PROTOCOL_(DestructorSafeContainer) PROTOCOL(StringInterpolationProtocol) PROTOCOL(AdditiveArithmetic) PROTOCOL(Differentiable) // Distributed Actors PROTOCOL(DistributedActor) PROTOCOL_(DistributedActorStub) PROTOCOL(DistributedActorSystem) PROTOCOL(DistributedTargetInvocationEncoder) PROTOCOL(DistributedTargetInvocationDecoder) PROTOCOL(DistributedTargetInvocationResultHandler) // C++ Standard Library Overlay: PROTOCOL(CxxConvertibleToBool) PROTOCOL(CxxConvertibleToCollection) PROTOCOL(CxxDictionary) PROTOCOL(CxxOptional) PROTOCOL(CxxPair) PROTOCOL(CxxSet) PROTOCOL(CxxRandomAccessCollection) PROTOCOL(CxxMutableRandomAccessCollection) PROTOCOL(CxxSequence) PROTOCOL(CxxUniqueSet) PROTOCOL(CxxVector) PROTOCOL(CxxSpan) PROTOCOL(CxxMutableSpan) PROTOCOL(UnsafeCxxInputIterator) PROTOCOL(UnsafeCxxMutableInputIterator) PROTOCOL(UnsafeCxxRandomAccessIterator) PROTOCOL(UnsafeCxxMutableRandomAccessIterator) PROTOCOL(UnsafeCxxContiguousIterator) PROTOCOL(UnsafeCxxMutableContiguousIterator) PROTOCOL(AsyncSequence) PROTOCOL(AsyncIteratorProtocol) PROTOCOL(FloatingPoint) #define INVERTIBLE_PROTOCOL(Name, Bit) \ INVERTIBLE_PROTOCOL_WITH_NAME(Name, #Name) #include "swift/ABI/InvertibleProtocols.def" REPRESSIBLE_PROTOCOL(BitwiseCopyable) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByArrayLiteral, "Array", false) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByBooleanLiteral, "BooleanLiteralType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByDictionaryLiteral, "Dictionary", false) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByExtendedGraphemeClusterLiteral, "ExtendedGraphemeClusterType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByFloatLiteral, "FloatLiteralType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByIntegerLiteral, "IntegerLiteralType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByStringInterpolation, "StringLiteralType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByStringLiteral, "StringLiteralType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByNilLiteral, nullptr, false) EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByUnicodeScalarLiteral, "UnicodeScalarType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByColorLiteral, "_ColorLiteralType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByImageLiteral, "_ImageLiteralType", true) EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByFileReferenceLiteral, "_FileReferenceLiteralType", true) BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinBooleanLiteral) BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinExtendedGraphemeClusterLiteral) BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinFloatLiteral) BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinIntegerLiteral) BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinStringLiteral) BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinUnicodeScalarLiteral) #undef EXPRESSIBLE_BY_LITERAL_PROTOCOL #undef EXPRESSIBLE_BY_LITERAL_PROTOCOL_ #undef EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME #undef BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_ #undef BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME #undef REPRESSIBLE_PROTOCOL_WITH_NAME #undef REPRESSIBLE_PROTOCOL #undef REPRESSIBLE_PROTOCOL_ #undef INVERTIBLE_PROTOCOL_WITH_NAME #undef PROTOCOL #undef PROTOCOL_ #undef PROTOCOL_WITH_NAME