protected bool ForEachMemoryBlock(MemoryReader mreader, Debugger debugger,
                                              string name, string type, string blockName,
                                              MemoryReader.Converter <double> elementConverter,
                                              MemoryBlockPredicate memoryBlockPredicate)
            {
                if (elementConverter == null)
                {
                    return(false);
                }
                int size           = LoadSize(debugger, name);
                var blockConverter = new MemoryReader.ArrayConverter <double>(elementConverter, size);

                ulong address = ExpressionParser.GetValueAddress(debugger, blockName);

                if (address == 0)
                {
                    return(false);
                }

                double[] values = new double[blockConverter.ValueCount()];
                if (!mreader.Read(address, values, blockConverter))
                {
                    return(false);
                }
                return(memoryBlockPredicate(values));
            }
            public override bool ForEachMemoryBlock(MemoryReader mreader, Debugger debugger,
                                                    string name, string type,
                                                    MemoryReader.Converter <double> elementConverter,
                                                    MemoryBlockPredicate memoryBlockPredicate)
            {
                if (elementConverter == null)
                {
                    return(false);
                }

                int size1, size2;

                LoadSizes(debugger, name, out size1, out size2);
                if (size1 <= 0)
                {
                    return(false);
                }

                {
                    ulong firstAddress = ExpressionParser.GetValueAddress(debugger, "(*(" + name + ".m_first))");
                    if (firstAddress == 0)
                    {
                        return(false);
                    }
                    var      blockConverter = new MemoryReader.ArrayConverter <double>(elementConverter, size1);
                    double[] values         = new double[blockConverter.ValueCount()];
                    if (!mreader.Read(firstAddress, values, blockConverter))
                    {
                        return(false);
                    }
                    if (!memoryBlockPredicate(values))
                    {
                        return(false);
                    }
                }

                if (size2 > 0)
                {
                    ulong buffAddress = ExpressionParser.GetValueAddress(debugger, "(*(" + name + ".m_buff))");
                    if (buffAddress == 0)
                    {
                        return(false);
                    }
                    var      blockConverter = new MemoryReader.ArrayConverter <double>(elementConverter, size2);
                    double[] values         = new double[blockConverter.ValueCount()];
                    if (!mreader.Read(buffAddress, values, blockConverter))
                    {
                        return(false);
                    }
                    if (!memoryBlockPredicate(values))
                    {
                        return(false);
                    }
                }

                return(true);
            }