Created
February 9, 2021 03:12
-
-
Save qaqland/557c498c59a21febb29c894af5119253 to your computer and use it in GitHub Desktop.
之前想写一个文本编辑器,这是数据结构
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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