//+------------------------------------------------------------------+
//|                                              CacheStatistics.mqh |
//| CCacheStatistics: tracks hit count, miss count, hit rate, and    |
//| estimated memory usage across the indicator cache session.       |
//+------------------------------------------------------------------+
#ifndef CACHESTATISTICS_MQH
#define CACHESTATISTICS_MQH

//+------------------------------------------------------------------+
//| CCacheStatistics                                                 |
//| Purpose: Performance analytics and telemetry for indicator reuse |
//+------------------------------------------------------------------+
class CCacheStatistics
  {
private:
   long                 m_hit_count;         // Total successful cache reuses
   long                 m_miss_count;        // Total new handle creations
   double               m_memory_est_kb;     // Aggregate estimated memory in KB

public:
                        CCacheStatistics(void);

   void                 RecordHit(void);
   void                 RecordMiss(double entry_memory_kb);
   void                 RecordRelease(double entry_memory_kb);
   void                 Reset(void);

   long                 GetHitCount(void)     const;
   long                 GetMissCount(void)    const;
   double               GetHitRate(void)      const;
   double               GetMemoryEstKB(void)  const;
   long                 GetTotalRequests(void) const;
  };

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CCacheStatistics::CCacheStatistics(void)
   :  m_hit_count(0),
      m_miss_count(0),
      m_memory_est_kb(0.0)
  {
   //--- Initialized metric values
  }

//+------------------------------------------------------------------+
//| RecordHit                                                        |
//+------------------------------------------------------------------+
void CCacheStatistics::RecordHit(void)
  {
   m_hit_count++;
  }

//+------------------------------------------------------------------+
//| RecordMiss                                                       |
//+------------------------------------------------------------------+
void CCacheStatistics::RecordMiss(double entry_memory_kb)
  {
   m_miss_count++;
   m_memory_est_kb += entry_memory_kb;
  }

//+------------------------------------------------------------------+
//| RecordRelease                                                    |
//+------------------------------------------------------------------+
void CCacheStatistics::RecordRelease(double entry_memory_kb)
  {
   m_memory_est_kb -= entry_memory_kb;
   if(m_memory_est_kb < 0.0)
     {
      m_memory_est_kb = 0.0;
     }
  }

//+------------------------------------------------------------------+
//| Reset                                                            |
//+------------------------------------------------------------------+
void CCacheStatistics::Reset(void)
  {
   m_hit_count     = 0;
   m_miss_count    = 0;
   m_memory_est_kb = 0.0;
  }

//+------------------------------------------------------------------+
//| GetHitCount                                                      |
//+------------------------------------------------------------------+
long CCacheStatistics::GetHitCount(void) const
  {
   return(m_hit_count);
  }

//+------------------------------------------------------------------+
//| GetMissCount                                                     |
//+------------------------------------------------------------------+
long CCacheStatistics::GetMissCount(void) const
  {
   return(m_miss_count);
  }

//+------------------------------------------------------------------+
//| GetHitRate                                                       |
//+------------------------------------------------------------------+
double CCacheStatistics::GetHitRate(void) const
  {
   long total = m_hit_count + m_miss_count;
   if(total == 0)
     {
      return(0.0);
     }
   return((m_hit_count / (double)total) * 100.0);
  }

//+------------------------------------------------------------------+
//| GetMemoryEstKB                                                   |
//+------------------------------------------------------------------+
double CCacheStatistics::GetMemoryEstKB(void) const
  {
   return(m_memory_est_kb);
  }

//+------------------------------------------------------------------+
//| GetTotalRequests                                                 |
//+------------------------------------------------------------------+
long CCacheStatistics::GetTotalRequests(void) const
  {
   return(m_hit_count + m_miss_count);
  }

#endif // CACHESTATISTICS_MQH
//+------------------------------------------------------------------+