root/headers/private/debugger/model/DisassembledCode.h
/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef DISASSEMBLED_CODE_H
#define DISASSEMBLED_CODE_H


#include <ObjectList.h>

#include "SourceCode.h"


class BString;
class ContiguousStatement;


class DisassembledCode : public SourceCode {
public:
                                                                DisassembledCode(SourceLanguage* language);
                                                                ~DisassembledCode();

        virtual bool                            Lock();
        virtual void                            Unlock();

        virtual SourceLanguage*         GetSourceLanguage() const;

        virtual bool                            GetStatementLocationRange(
                                                                        const SourceLocation& location,
                                                                        SourceLocation& _start,
                                                                        SourceLocation& _end) const;

        virtual LocatableFile*          GetSourceFile() const;

                        Statement*                      StatementAtAddress(target_addr_t address) const;
                        Statement*                      StatementAtLocation(
                                                                        const SourceLocation& location) const;
                        TargetAddressRange      StatementAddressRange() const;

        // LineDataSource
        virtual int32                           CountLines() const;
        virtual const char*                     LineAt(int32 index) const;
        virtual int32                           LineLengthAt(int32 index) const;

public:
                        bool                            AddCommentLine(const BString& line);
                        bool                            AddInstructionLine(const BString& line,
                                                                        target_addr_t address, target_size_t size);
                                                                                // instructions must be added in
                                                                                // ascending address order

private:
                        struct Line;

                        typedef BObjectList<Line, true> LineList;
                        typedef BObjectList<ContiguousStatement> StatementList;

private:
                        bool                            _AddLine(const BString& line,
                                                                        ContiguousStatement* statement);
        static  int                                     _CompareAddressStatement(
                                                                        const target_addr_t* address,
                                                                        const ContiguousStatement* statement);

private:
                        SourceLanguage*         fLanguage;
                        LineList                        fLines;
                        StatementList           fStatements;
};


#endif  // DISASSEMBLED_CODE_H