public AttachListTable_val GetAttachListTable_val()
        {
            AttachListTable_val alt = null;

            if (AttachListOffset != 0)
            {
                alt = new AttachListTable_val(AttachListOffset, m_bufTable);
            }

            return alt;
        }
        public AttachListTable_val GetAttachListTable_val()
        {
            AttachListTable_val alt = null;

            if (AttachListOffset != 0)
            {
                alt = new AttachListTable_val(AttachListOffset, m_bufTable);
            }

            return alt;
        }
        /************************
         * public methods
         */


        public bool Validate(Validator v, OTFontVal fontOwner)
        {
            bool bRet = true;

            if (v.PerformTest(T.GDEF_Version))
            {
                if (Version.GetUint() == 0x00010000 || Version.GetUint() == 0x00010002 || Version.GetUint() == 0x00010003)
                {
                    v.Pass(T.GDEF_Version, P.GDEF_P_Version, m_tag, "0x"+ Version.GetUint().ToString("x8"));
                }
                else
                {
                    v.Error(T.GDEF_Version, E.GDEF_E_Version, m_tag, "0x" + Version.GetUint().ToString("x8"));
                }
            }

            if (v.PerformTest(T.GDEF_HeaderOffsets))
            {
                bool bOffsetsOk = true;

                if (GlyphClassDefOffset != 0)
                {
                    if (GlyphClassDefOffset > m_bufTable.GetLength())
                    {
                        v.Error(T.GDEF_HeaderOffsets, E.GDEF_E_HeaderOffset, m_tag, "GlyphClassDef");
                        bOffsetsOk = false;
                        bRet = false;
                    }
                }

                if (AttachListOffset != 0)
                {
                    if (AttachListOffset > m_bufTable.GetLength())
                    {
                        v.Error(T.GDEF_HeaderOffsets, E.GDEF_E_HeaderOffset, m_tag, "AttachList");
                        bOffsetsOk = false;
                        bRet = false;
                    }
                }

                if (LigCaretListOffset != 0)
                {
                    if (LigCaretListOffset > m_bufTable.GetLength())
                    {
                        v.Error(T.GDEF_HeaderOffsets, E.GDEF_E_HeaderOffset, m_tag, "LigCaretList");
                        bOffsetsOk = false;
                        bRet = false;
                    }
                }

                if (MarkAttachClassDefOffset != 0)
                {
                    if (MarkAttachClassDefOffset > m_bufTable.GetLength())
                    {
                        v.Error(T.GDEF_HeaderOffsets, E.GDEF_E_HeaderOffset, m_tag, "MarkAttachClassDef");
                        bOffsetsOk = false;
                        bRet = false;
                    }
                }

                if (MarkGlyphSetsDefOffset != 0)
                {
                    if (MarkGlyphSetsDefOffset > m_bufTable.GetLength())
                    {
                        v.Error(T.GDEF_HeaderOffsets, E.GDEF_E_HeaderOffset, m_tag, "MarkGlyphSetsDef");
                        bOffsetsOk = false;
                        bRet = false;
                    }
                }

                if (bOffsetsOk == true)
                {
                    v.Pass(T.GDEF_HeaderOffsets, P.GDEF_P_HeaderOffsets, m_tag);
                }
            }

            if (v.PerformTest(T.GDEF_Subtables))
            {
                if (GlyphClassDefOffset != 0)
                {
                    ClassDefTable_val cdt = GetGlyphClassDefTable_val();
                    cdt.Validate(v, "GlyphClassDef", this);
                }

                if (AttachListOffset != 0)
                {
                    AttachListTable_val alt = GetAttachListTable_val();
                    alt.Validate(v, "AttachList", this);
                }

                if (LigCaretListOffset != 0)
                {
                    LigCaretListTable_val lclt = GetLigCaretListTable_val();
                    lclt.Validate(v, "LigCaretList", this);
                }

                if (MarkAttachClassDefOffset != 0)
                {
                    ClassDefTable_val macdt = GetMarkAttachClassDefTable_val();
                    macdt.Validate(v, "MarkAttachClassDef", this);
                }

                if (MarkGlyphSetsDefOffset != 0)
                {
                    MarkGlyphSetsDefTable_val mgsdt = GetMarkGlyphSetsDefTable_val();
                    mgsdt.Validate(v, "MarkGlyphSetsDef", this);
                }
            }

            // TODO: Version 1.3: Item Variation Store table
            return bRet;
        }