Ideas which I have been tossing around in my head are:
The first should be sufficient for Age: calculation, and both combined for ICP/digest.
The freshness TTL represents the amount of time from the request date the object is considered fresh. Recalculated each time the full object data is known (refreshes or hits).
The "last referenced" timestamp is redundant as this information is kept by the removal policy.
The simple way is to reserve space for the removal node in the store entry, and then use the OFFSETOF macro from cbdata to go back from the node to the StoreEntry.. And similary for memory entries..
The only criteria is that a fixed amount of space is set aside for the removal policy, and that none of the policies attempts to use more than that (a simple sizeof assert in the policy initialization should make sure of that)