public override void ReadKeyPartsFrom(ref SliceReader reader, int count, out (T1, T2) items)
                {
                    Contract.Requires(count > 0);

                    items.Item1 = count >= 1 ? m_codec1.DecodeOrderedSelfTerm(ref reader) : default;
                    items.Item2 = count >= 2 ? m_codec2.DecodeOrderedSelfTerm(ref reader) : default;
                    if (reader.HasMore)
                    {
                        throw new InvalidOperationException($"Unexpected data at the end of composite key after {count} items");
                    }
                }
                public override FdbTuple <T1, T2> DecodeComposite(Slice encoded, int count)
                {
                    Contract.Requires(count > 0);

                    var reader = new SliceReader(encoded);
                    T1  key1   = default(T1);
                    T2  key2   = default(T2);

                    if (count >= 1)
                    {
                        key1 = m_codec1.DecodeOrderedSelfTerm(ref reader);
                    }
                    if (count >= 2)
                    {
                        key2 = m_codec2.DecodeOrderedSelfTerm(ref reader);
                    }
                    if (reader.HasMore)
                    {
                        throw new InvalidOperationException(String.Format("Unexpected data at the end of composite key after {0} items", count));
                    }
                    return(FdbTuple.Create <T1, T2>(key1, key2));
                }