-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathempty.go
More file actions
96 lines (84 loc) · 2.44 KB
/
empty.go
File metadata and controls
96 lines (84 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Copyright 2020 Anapaya Systems
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +gobra
package empty
import (
"github.com/scionproto/scion/pkg/private/serrors"
"github.com/scionproto/scion/pkg/slayers/path"
)
// PathLen is the length of a serialized empty path in bytes.
const PathLen = 0
const PathType path.Type = 0
// @ requires path.PkgMem()
// @ requires path.RegisteredTypes().DoesNotContain(int64(PathType))
// @ ensures path.PkgMem()
// @ ensures path.RegisteredTypes().Contains(int64(PathType))
// @ decreases
func RegisterPath() {
tmp := path.Metadata{
Type: PathType,
Desc: "Empty",
New:
//@ ensures p.NonInitMem()
//@ ensures p != nil
//@ decreases
func /*@ newPath @*/ () (p path.Path) {
emptyTmp := Path{}
//@ fold emptyTmp.NonInitMem()
return emptyTmp
},
}
//@ proof tmp.New implements path.NewPathSpec {
//@ return tmp.New() as newPath
//@ }
path.RegisterPath(tmp)
}
// Path encodes an empty path. An empty path is a special path that takes zero
// bytes on the wire and is used for AS internal communication.
type Path struct{}
// @ ensures len(r) == 0 ==> (e == nil && o.Mem(r))
// @ ensures len(r) != 0 ==> (e != nil && e.ErrorMem() && o.NonInitMem())
// @ decreases
func (o Path) DecodeFromBytes(r []byte) (e error) {
if len(r) != 0 {
//@ fold o.NonInitMem()
return serrors.New("decoding an empty path", "len", len(r))
}
//@ fold o.Mem(r)
return nil
}
// @ ensures e == nil
// @ decreases
func (o Path) SerializeTo(b []byte /*@, ub []byte @*/) (e error) {
return nil
}
// @ requires o.Mem(ub)
// @ ensures p == o
// @ ensures p.Mem(ub)
// @ ensures e == nil
// @ decreases
func (o Path) Reverse( /*@ ub []byte @*/ ) (p path.Path, e error) {
return o, nil
}
// @ ensures r == o.LenSpec(ub)
// @ decreases
func (o Path) Len( /*@ ub []byte @*/ ) (r int) {
return PathLen
}
// @ pure
// @ ensures r == PathType
// @ decreases
func (o Path) Type( /*@ ub []byte @*/ ) (r path.Type) {
return PathType
}