Enhanced C#
Loyc library documentation
 All Classes Namespaces Functions Variables Enumerations Enumerator Properties Events Pages
Class List
Here are the classes, structs, unions and interfaces with brief descriptions:
[detail level 12345]
 NLeMPThe lexical macro processor. Main classes: LeMP.Compiler and LeMP.MacroProcessor.
 NLoycMain Loyc namespace. This namespace includes all general-purpose code in the Loyc megaproject. It includes the code of Loyc.Essentials.dll and Loyc.Collections.dll (collections, geometry, MiniTest, MessageSink, etc.), and also the code of Loyc.Syntax.dll.
 CDefaultSyncField< SyncManager, T >An ISyncField{SM,T} that synchronizes via DefaultSynchronizer{SM,T}. It is used to build default synchronizers for collections (the items are synchronized recursively via their own default synchronizers) and can be used the same way in user code.
 CDefaultSynchronizerThe "synchronize any T with zero configuration" dispatcher. Given a type T, Supports and Sync try to find some mechanism to serialize it.
 CDefaultSynchronizer< SyncManager, T >
 CDynamicSync< SM, T >A synchronizer for dynamically-typed (polymorphic) fields: when writing, the runtime type of the value selects a synchronizer from a TypeSyncRegistry and its type tag (from a TypeTagRegistry) is recorded; when reading, the type tag read from the data stream selects the synchronizer. Being an ordinary ISyncField{SM, T}, it composes with the list/collection helpers (e.g. as the item synchronizer of a list).
 CExtraSynchronizers< SyncManager >Default synchronizers, beyond those provided by the SyncManager itself and by TupleSynchronizer{SM}, that DefaultSynchronizer{SM,T} discovers via reflection (once per closed generic pair): arrays, common collections, dictionaries, KeyValuePair, enums, DateTime and TimeSpan. Collection items are synchronized recursively via DefaultSyncField{SM,T}, so e.g. List<(int, Person[])> works as long as Person is registered in the ambient TypeSyncRegistry.
 CMemory2< T >Memory{T}.Span is slower than you'd expect (even on modern .NET) because it holds an object reference and every call to Span must figure out what kind of object it is (there are three cases). This type exists to speed up that property in the usual case that it's an array.
 CPredefinedSynchronizer< SyncManager >Gets synchronizer functions for types with built-in support, such as int, enums, tuples, or arrays of primitives – work in progress.
 CReadOnlyMemory2< T >ReadOnlyMemory{T}.Span is slower than you'd expect (even on modern .NET) because it holds an object reference and every call to Span must figure out what kind of object it is (there are three cases). This type exists to speed up that property in the usual case that it's an array.
 CStreamScannerAn implementation of IScanner{T} that reads from a Stream.
 CSyncBinaryf Convenience methods for a fast pair of ISyncManager implementations intended for binary files/streams. The binary format is very fast and compact because it stores no metadata, but it must be used with care to avoid data corruption (see remarks).
 CSyncDynamicExtExtension methods for dynamically-typed (polymorphic) synchronization. By default these use the ambient services TypeSyncRegistry.Default and TypeTagRegistry.Default; overloads that accept registry instances bypass the ambient services. See TypeSyncRegistry, TypeTagRegistry and TypeTagAttribute to learn how dynamic typing works.
 CSyncJson
 CSyncProtobufConvenience methods and shared definitions for a pair of ISyncManager implementations (Reader and Writer) that read and write the Protocol Buffers wire format. Call Write{T}(T, SyncObjectFunc{Writer, T}, Options?) or Read{T}(ReadOnlyMemory{byte}, SyncObjectFunc{Reader, T}, Options?) to (de)serialize an object, NewWriter / NewReader(ReadOnlyMemory{byte}, Options?) to obtain a low-level (de)serializer, or WriteSchema{T}(SyncObjectFunc{SchemaWriter, T}, Options?) to generate a .proto schema describing the output.
 CTupleSynchronizer< SyncManager >System.ValueTuple synchronizers - work in progress!
 CTypeSyncRegistryA registry that maps data types to synchronizers, to support dynamic typing (polymorphic serialization): writing an object whose runtime type is not known statically, and reading it back via the type tag stored in the data stream.
 CTypeTagAttributeAssigns a "type tag" to a synchronizer, which identifies the type of object it reads/writes within a data stream, enabling dynamic typing (polymorphic serialization and deserialization).
 CTypeTagRegistryThe module that registers and resolves type tags: it encapsulates (1) the bidirectional dictionary between type tags and .NET types, (2) the convention by which tags are attached to synchronizers (the TypeTagAttribute), and (3) the policy for tags in a data stream that don't match anything registered or expected. All three are customizable: the dictionary via Add, and the convention and policies by overriding the virtual methods in a derived class and swapping it in with SetDefault (the Ambient Service Pattern).