bedrock.lang.cpp.logic.core_string
(*
* Copyright (C) BedRock Systems Inc. 2023
* This software is distributed under the terms of the BedRock Open-Source License.
* See the LICENSE-BedRock file in the repository root for details.
*)
Require Import elpi.apps.locker.locker.
Require Import bedrock.lang.proofmode.proofmode.
Require Import bedrock.lang.bi.prelude.
Require Import bedrock.lang.bi.observe.
Require Import bedrock.lang.cpp.semantics.values.
Require Import bedrock.lang.cpp.logic.arr.
Require Import bedrock.lang.cpp.logic.heap_pred.
Import ChargeNotation.
#[local] Open Scope Z_scope.
* Copyright (C) BedRock Systems Inc. 2023
* This software is distributed under the terms of the BedRock Open-Source License.
* See the LICENSE-BedRock file in the repository root for details.
*)
Require Import elpi.apps.locker.locker.
Require Import bedrock.lang.proofmode.proofmode.
Require Import bedrock.lang.bi.prelude.
Require Import bedrock.lang.bi.observe.
Require Import bedrock.lang.cpp.semantics.values.
Require Import bedrock.lang.cpp.logic.arr.
Require Import bedrock.lang.cpp.logic.heap_pred.
Import ChargeNotation.
#[local] Open Scope Z_scope.
Core C++ string theory: part of the semantics.
strings_bytesR ct q chars is q (const) fractional ownership of
chars with a trailing 0.
NOTE that chars is in units of *characters* using the standard
character encoding (see syntax/expr.v). This is *not* the
same as bytes, and will not be for multi-byte characters.
- Unlike zstring.t, does not assume the contents avoid `0` elements, since that property might not be guaranteed in all character types/encodings.
- Used for string literals of arbitrary character types.
mlock
Definition string_bytesR `{Σ : cpp_logic} {σ : genv} (cty : char_type) (q : cQp.t) (ls : list N) : Rep :=
let ty := Tchar_ cty in
arrayR ty (λ c, primR ty q (N_to_char cty c)) (ls ++ [0%N]).
#[global] Arguments string_bytesR {_ _ _ _} _ _ _ : assert.
(* Arguments char_type.bitsN !_ /.
Arguments char_type.bytesN !_ /. *)
Lemma N_to_char_Cchar_eq (c : N) :
(c < 2 ^ 8)%N ->
N_to_char char_type.Cchar c = Vchar c.
Proof.
intros.
rewrite /N_to_char /operator.trimN/=. f_equiv.
exact: N.mod_small.
Qed.
Section with_Σ.
Context `{Σ : cpp_logic} {σ : genv}.
#[global] Instance string_bytesR_timeless : Timeless3 string_bytesR.
Proof. rewrite string_bytesR.unlock /=. apply _. Qed.
#[global] Instance string_bytesR_cfrac cty : CFractional1 (string_bytesR cty).
Proof. rewrite string_bytesR.unlock /=. apply _. Qed.
End with_Σ.
Definition string_bytesR `{Σ : cpp_logic} {σ : genv} (cty : char_type) (q : cQp.t) (ls : list N) : Rep :=
let ty := Tchar_ cty in
arrayR ty (λ c, primR ty q (N_to_char cty c)) (ls ++ [0%N]).
#[global] Arguments string_bytesR {_ _ _ _} _ _ _ : assert.
(* Arguments char_type.bitsN !_ /.
Arguments char_type.bytesN !_ /. *)
Lemma N_to_char_Cchar_eq (c : N) :
(c < 2 ^ 8)%N ->
N_to_char char_type.Cchar c = Vchar c.
Proof.
intros.
rewrite /N_to_char /operator.trimN/=. f_equiv.
exact: N.mod_small.
Qed.
Section with_Σ.
Context `{Σ : cpp_logic} {σ : genv}.
#[global] Instance string_bytesR_timeless : Timeless3 string_bytesR.
Proof. rewrite string_bytesR.unlock /=. apply _. Qed.
#[global] Instance string_bytesR_cfrac cty : CFractional1 (string_bytesR cty).
Proof. rewrite string_bytesR.unlock /=. apply _. Qed.
End with_Σ.