void ReadNodes <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s)
            where TDoc : class
            where TCursor : class
        {
            var xs = s.GetSerializerInterface();

            Collections.IProtoEnum penum = Bits.InitializeFromEnum(xs.Database);

            if (Params.ElementItselfMeansTrue)
            {
                var getDefault = Bits.Params.kGetMemberDefaultValue;
                foreach (var e in s.Elements)
                {
                    var element_name = s.GetElementName(e);
                    int id           = penum.TryGetMemberId(element_name);
                    if (id.IsNone())
                    {
                        continue;
                    }

                    bool flag = true;
                    s.StreamElementOpt(element_name, ref flag);

                    if (getDefault != null && flag != getDefault(id))
                    {
                        // do nothing, allow the Set call below
                    }
                    else if (!flag)
                    {
                        continue;
                    }

                    Bits.Set(id, flag);
                }
            }
            else
            {
                foreach (var n in s.ElementsByName(Params.ElementName))
                {
                    using (s.EnterCursorBookmark(n))
                    {
                        string name = null;
                        Params.StreamDataName(s, ref name);

                        int id = penum.GetMemberId(name);
                        Bits.Set(id);
                    }
                }
            }

            Bits.OptimizeStorage();
        }