public static void Encode(
            this AssetLibraryManager assetLibraryManager,
            BitWriter writer,
            Platform platform,
            AssetGroup group,
            Items.PackedAssetReference value)
        {
            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            var config = assetLibraryManager.Configurations[group];

            uint index;

            if (value == Items.PackedAssetReference.None)
            {
                index = config.NoneIndex;
            }
            else
            {
                index  = 0;
                index |= (((uint)value.AssetIndex) & config.AssetMask) << 0;
                index |= (((uint)value.SublibraryIndex) & config.SublibraryMask) << config.AssetBits;

                if (value.UseSetId == true)
                {
                    index |= 1u << config.AssetBits + config.SublibraryBits - 1;
                }
            }

            writer.WriteUInt32(index, config.SublibraryBits + config.AssetBits);
        }
        public static void Encode(this AssetLibraryManager alm,
                                  BitWriter writer,
                                  int setId,
                                  AssetGroup group,
                                  string value)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            if (string.IsNullOrEmpty(value) == true)
            {
                throw new ArgumentNullException("value");
            }

            var config = alm.Configurations[group];

            uint index;

            if (value == "None")
            {
                index = config.NoneIndex;
            }
            else
            {
                var parts = value.Split(new[]
                {
                    '.'
                },
                                        2);
                if (parts.Length != 2)
                {
                    throw new ArgumentException();
                }

                var package = parts[0];
                var asset   = parts[1];

                if (alm.GetIndex(setId, group, package, asset, out index) == false)
                {
                    if (alm.GetIndex(0, group, package, asset, out index) == false)
                    {
                        throw new ArgumentException("unsupported asset");
                    }
                }
            }

            writer.WriteUInt32(index, config.SublibraryBits + config.AssetBits);
        }
        public static void Encode(this AssetLibraryManager alm,
                                  BitWriter writer,
                                  int setId,
                                  AssetGroup group,
                                  string value)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            if (string.IsNullOrEmpty(value) == true)
            {
                throw new ArgumentNullException("value");
            }

            var config = alm.Configurations[group];

            uint index;
            if (value == "None")
            {
                index = config.NoneIndex;
            }
            else
            {
                var parts = value.Split(new[]
                {
                    '.'
                },
                                        2);
                if (parts.Length != 2)
                {
                    throw new ArgumentException();
                }

                var package = parts[0];
                var asset = parts[1];

                if (alm.GetIndex(setId, group, package, asset, out index) == false)
                {
                    if (alm.GetIndex(0, group, package, asset, out index) == false)
                    {
                        throw new ArgumentException("unsupported asset");
                    }
                }
            }

            writer.WriteUInt32(index, config.SublibraryBits + config.AssetBits);
        }