Skip to content

Instantly share code, notes, and snippets.

@qaqland
Created February 9, 2021 03:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save qaqland/557c498c59a21febb29c894af5119253 to your computer and use it in GitHub Desktop.
Save qaqland/557c498c59a21febb29c894af5119253 to your computer and use it in GitHub Desktop.
之前想写一个文本编辑器,这是数据结构
package main
import "fmt"
type gapBuffer struct {
buff []byte
begin int
size int
}
//NewGapBuffer 创建一个空白的 gapbuffer
func NewGapBuffer() *gapBuffer {
gapBuffer := gapBuffer{[]byte{0, 1, 2, 3, 4, 5, 6, 0, 0, 0}, 7, 3}
//gapBuffer := gapBuffer{[]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}, 0, 3}
fmt.Println(gapBuffer.buff)
return &gapBuffer
}
func (g *gapBuffer) InsertAt(index int, b byte) {
// fmt.Println(g.buff)
if g.size == 0 {
//容量不够了,要扩容
//扩容多少呢,扩容3吧
moreBuff := 3
g.buff = append(g.buff, make([]byte, moreBuff)...)
//扩容之后把最后的空格移动到gap这里来
for i := 0; i < len(g.buff)-g.begin-moreBuff; i++ {
g.buff[len(g.buff)-i-1] = g.buff[len(g.buff)-moreBuff-i-1]
}
g.size += moreBuff
}
if index < g.begin {
//0123456789
//abcdefg...
//abcdef...g
//abcde...fg
for i := 0; i < g.begin-index; i++ {
g.buff[g.begin+g.size-i-1] = g.buff[g.begin-i-1]
// fmt.Println(g.buff)
}
} else if index > g.begin {
//...abcdefg
//a...bcdefg
//ab...cdefg
for i := 0; i < index-g.begin; i++ {
// [gap---in]dex 由于buff中的gap不可见,不会存在index在末尾导致的buff溢出
g.buff[g.begin+i] = g.buff[g.begin+g.size+i]
// fmt.Println(g.buff)
}
}
g.begin = index
g.buff[g.begin] = b //插入数据
g.begin++ //移动到gap下个位置
g.size-- //容量减1
}
func (g *gapBuffer) DeleteAt(index int) {
if g.size == 0 {
g.begin = index
}
if index <= g.begin { //简单
for i := 0; i < g.begin-index-1; i++ {
g.buff[g.begin+g.size-i-1] = g.buff[g.begin-i-1]
// fmt.Println(g.buff)
}
} else if index > g.begin {
for i := 0; i < index-g.begin; i++ {
g.buff[g.begin+i] = g.buff[g.begin+g.size+i]
// fmt.Println(g.buff)
}
}
g.size++
g.begin = index
// fmt.Println(g.buff, g.begin, g.size)
}
func (g *gapBuffer) Insert(index int, str string) {
for i, c := range str {
g.InsertAt(index+i, byte(c))
// fmt.Println(g.buff)
}
}
func (g *gapBuffer) Delete(index int, number int) {
for i := 0; i < number; i++ {
g.DeleteAt(index - i)
fmt.Println(g.buff, g.begin, g.size)
}
}
func (g *gapBuffer) ToString() string {
return string(g.buff[:g.begin]) + string(g.buff[g.begin+g.size:])
}
func main() {
NewGapBuffer().Delete(5, 2)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment