root/src/bin/debug/profile/SummaryProfileResult.h
/*
 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef SUMMARY_PROFILE_RESULT_H
#define SUMMARY_PROFILE_RESULT_H


#include <util/OpenHashTable.h>

#include "ProfileResult.h"


class SummaryImage {
public:
                                                                SummaryImage(ImageProfileResult* result);
                                                                ~SummaryImage();

                        ImageProfileResult*     Result() const  { return fResult; }
                        SharedImage*            GetImage() const { return fResult->GetImage(); }

                        SummaryImage*&          HashNext()                      { return fHashNext; }

private:
                        ImageProfileResult*     fResult;
                        SummaryImage*           fHashNext;
};


struct SummaryImageHashDefinition {
        typedef SharedImage*    KeyType;
        typedef SummaryImage    ValueType;

        size_t HashKey(SharedImage* key) const
        {
                return (addr_t)key / (2 * sizeof(void*));
        }

        size_t Hash(SummaryImage* value) const
        {
                return HashKey(value->GetImage());
        }

        bool Compare(SharedImage* key, SummaryImage* value) const
        {
                return value->GetImage() == key;
        }

        SummaryImage*& GetLink(SummaryImage* value) const
        {
                return value->HashNext();
        }
};


class SummaryProfileResult : public ProfileResult,
        private ImageProfileResultContainer {
public:
                                                                SummaryProfileResult(ProfileResult* result);
        virtual                                         ~SummaryProfileResult();

        virtual status_t                        Init(ProfiledEntity* entity);

        virtual void                            SetInterval(bigtime_t interval);

        virtual void                            AddSamples(
                                                                        ImageProfileResultContainer* container,
                                                                        addr_t* samples, int32 sampleCount);
        virtual void                            AddExpectedTicks(int32 expected);
        virtual void                            AddDroppedTicks(int32 dropped);
        virtual void                            PrintResults(
                                                                        ImageProfileResultContainer* container);

        virtual status_t                        GetImageProfileResult(SharedImage* image,
                                                                        image_id id,
                                                                        ImageProfileResult*& _imageResult);

                        void                            PrintSummaryResults();

private:
                        typedef BOpenHashTable<SummaryImageHashDefinition> ImageTable;

private:
        // ImageProfileResultContainer
        virtual int32                           CountImages() const;
        virtual ImageProfileResult*     VisitImages(Visitor& visitor) const;
        virtual ImageProfileResult*     FindImage(addr_t address,
                                                                        addr_t& _loadDelta) const;

private:
                        ProfileResult*          fResult;
                        ImageTable                      fImages;
                        image_id                        fNextImageID;
};


#endif  // SUMMARY_PROFILE_RESULT_H