84 lines
2.5 KiB
Text
84 lines
2.5 KiB
Text
/-
|
||
Copyright (c) 2020 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura
|
||
-/
|
||
prelude
|
||
import Init.Notation
|
||
|
||
/- SizeOf -/
|
||
|
||
class SizeOf (α : Sort u) where
|
||
sizeOf : α → Nat
|
||
|
||
export SizeOf (sizeOf)
|
||
|
||
/-
|
||
Declare sizeOf instances and theorems for types declared before SizeOf.
|
||
From now on, the inductive Compiler will automatically generate sizeOf instances and theorems.
|
||
-/
|
||
|
||
/- Every Type `α` has a default SizeOf instance that just returns 0 for every element of `α` -/
|
||
protected def default.sizeOf (α : Sort u) : α → Nat
|
||
| a => 0
|
||
|
||
instance (priority := low) (α : Sort u) : SizeOf α where
|
||
sizeOf := default.sizeOf α
|
||
|
||
@[simp] theorem sizeOf_default (n : α) : sizeOf n = 0 := rfl
|
||
|
||
instance : SizeOf Nat where
|
||
sizeOf n := n
|
||
|
||
@[simp] theorem sizeOf_nat (n : Nat) : sizeOf n = n := rfl
|
||
|
||
instance [SizeOf α] : SizeOf (Unit → α) where
|
||
sizeOf f := sizeOf (f ())
|
||
|
||
@[simp] theorem sizeOf_thunk [SizeOf α] (f : Unit → α) : sizeOf f = sizeOf (f ()) :=
|
||
rfl
|
||
|
||
deriving instance SizeOf for Prod
|
||
deriving instance SizeOf for PUnit
|
||
deriving instance SizeOf for Bool
|
||
deriving instance SizeOf for Option
|
||
deriving instance SizeOf for List
|
||
deriving instance SizeOf for Array
|
||
deriving instance SizeOf for Subtype
|
||
deriving instance SizeOf for Fin
|
||
deriving instance SizeOf for USize
|
||
deriving instance SizeOf for UInt8
|
||
deriving instance SizeOf for UInt16
|
||
deriving instance SizeOf for UInt32
|
||
deriving instance SizeOf for UInt64
|
||
deriving instance SizeOf for Char
|
||
deriving instance SizeOf for String
|
||
deriving instance SizeOf for Substring
|
||
deriving instance SizeOf for Except
|
||
deriving instance SizeOf for EStateM.Result
|
||
|
||
@[simp] theorem Unit.sizeOf (u : Unit) : sizeOf u = 1 := rfl
|
||
@[simp] theorem Bool.sizeOf_eq_one (b : Bool) : sizeOf b = 1 := by cases b <;> rfl
|
||
|
||
namespace Lean
|
||
|
||
/- We manually define `Lean.Name` instance because we use
|
||
an opaque function for computing the hashcode field. -/
|
||
protected noncomputable def Name.sizeOf : Name → Nat
|
||
| anonymous => 1
|
||
| str p s _ => 1 + Name.sizeOf p + sizeOf s
|
||
| num p n _ => 1 + Name.sizeOf p + sizeOf n
|
||
|
||
noncomputable instance : SizeOf Name where
|
||
sizeOf n := n.sizeOf
|
||
|
||
@[simp] theorem Name.anonymous.sizeOf_spec : sizeOf anonymous = 1 :=
|
||
rfl
|
||
@[simp] theorem Name.str.sizeOf_spec (p : Name) (s : String) (h : UInt64) : sizeOf (str p s h) = 1 + sizeOf p + sizeOf s :=
|
||
rfl
|
||
@[simp] theorem Name.num.sizeOf_spec (p : Name) (n : Nat) (h : UInt64) : sizeOf (num p n h) = 1 + sizeOf p + sizeOf n :=
|
||
rfl
|
||
|
||
deriving instance SizeOf for Syntax
|
||
|
||
end Lean
|