packages feed

croaring-ffi-1.0: src/Data/Bitmap/Roaring/FFI/Bitmap/Statistics.hsc

{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE NoFieldSelectors #-}

-- | C struct @roaring_statistics_t@ from @roaring/roaring_types.h@, filled in by 'Data.Bitmap.Roaring.FFI.Bitmap.statistics'.
module Data.Bitmap.Roaring.FFI.Bitmap.Statistics
  ( Statistics (..)
  ) where

#include <roaring/roaring.h>

import Data.Word (Word32, Word64)
import Foreign.Marshal.Utils (fillBytes)
import Foreign.Storable (Storable (..))

-- | @roaring_statistics_t@ without the deprecated, always-zero @sum_value@ field, which 'poke' zero-fills.
data Statistics = Statistics
  { containers :: Word32
  , arrayContainers :: Word32
  , runContainers :: Word32
  , bitsetContainers :: Word32
  , valuesArrayContainers :: Word32
  , valuesRunContainers :: Word32
  , valuesBitsetContainers :: Word32
  , bytesArrayContainers :: Word32
  , bytesRunContainers :: Word32
  , bytesBitsetContainers :: Word32
  , maxValue :: Word32
  -- ^ Undefined when the cardinality is zero.
  , minValue :: Word32
  -- ^ Undefined when the cardinality is zero.
  , cardinality :: Word64
  }
  deriving (Eq, Ord, Show)

instance Storable Statistics where
  sizeOf _ = #{size roaring_statistics_t}
  {-# INLINE sizeOf #-}
  alignment _ = #{alignment roaring_statistics_t}
  {-# INLINE alignment #-}
  peek ptr =
    Statistics
      <$> #{peek roaring_statistics_t, n_containers} ptr
      <*> #{peek roaring_statistics_t, n_array_containers} ptr
      <*> #{peek roaring_statistics_t, n_run_containers} ptr
      <*> #{peek roaring_statistics_t, n_bitset_containers} ptr
      <*> #{peek roaring_statistics_t, n_values_array_containers} ptr
      <*> #{peek roaring_statistics_t, n_values_run_containers} ptr
      <*> #{peek roaring_statistics_t, n_values_bitset_containers} ptr
      <*> #{peek roaring_statistics_t, n_bytes_array_containers} ptr
      <*> #{peek roaring_statistics_t, n_bytes_run_containers} ptr
      <*> #{peek roaring_statistics_t, n_bytes_bitset_containers} ptr
      <*> #{peek roaring_statistics_t, max_value} ptr
      <*> #{peek roaring_statistics_t, min_value} ptr
      <*> #{peek roaring_statistics_t, cardinality} ptr
  {-# INLINE peek #-}
  poke ptr statistics = do
    fillBytes ptr 0 #{size roaring_statistics_t}
    #{poke roaring_statistics_t, n_containers} ptr statistics.containers
    #{poke roaring_statistics_t, n_array_containers} ptr statistics.arrayContainers
    #{poke roaring_statistics_t, n_run_containers} ptr statistics.runContainers
    #{poke roaring_statistics_t, n_bitset_containers} ptr statistics.bitsetContainers
    #{poke roaring_statistics_t, n_values_array_containers} ptr statistics.valuesArrayContainers
    #{poke roaring_statistics_t, n_values_run_containers} ptr statistics.valuesRunContainers
    #{poke roaring_statistics_t, n_values_bitset_containers} ptr statistics.valuesBitsetContainers
    #{poke roaring_statistics_t, n_bytes_array_containers} ptr statistics.bytesArrayContainers
    #{poke roaring_statistics_t, n_bytes_run_containers} ptr statistics.bytesRunContainers
    #{poke roaring_statistics_t, n_bytes_bitset_containers} ptr statistics.bytesBitsetContainers
    #{poke roaring_statistics_t, max_value} ptr statistics.maxValue
    #{poke roaring_statistics_t, min_value} ptr statistics.minValue
    #{poke roaring_statistics_t, cardinality} ptr statistics.cardinality
  {-# INLINE poke #-}