simple_tree.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package stub
  2. /*
  3. простая реализация модели документа
  4. */
  5. import (
  6. "odf/model"
  7. "ypk/assert"
  8. )
  9. type sn struct {
  10. name model.LeafName
  11. attr map[model.AttrName]model.Attribute
  12. children []model.Leaf
  13. }
  14. func (n *sn) Attr(name model.AttrName, val ...model.Attribute) model.Attribute {
  15. assert.For(len(val) <= 1, 20, "only one attribute accepted")
  16. assert.For(name != "", 21)
  17. if len(val) == 1 {
  18. n.attr[name] = val[0]
  19. }
  20. return n.attr[name]
  21. }
  22. func (n *sn) Child(i int) model.Leaf {
  23. assert.For(i < len(n.children), 20)
  24. return n.children[i]
  25. }
  26. func (n *sn) IndexOf(l model.Leaf) (ret int) {
  27. ret = -1
  28. for i := 0; i < len(n.children) && ret == -1; i++ {
  29. if l == n.children[i] {
  30. ret = i
  31. }
  32. }
  33. return
  34. }
  35. func (n *sn) NofChild() int {
  36. return len(n.children)
  37. }
  38. func (n *sn) Name() model.LeafName {
  39. return n.name
  40. }
  41. func (n *sn) init() {
  42. n.attr = make(map[model.AttrName]model.Attribute)
  43. n.children = make([]model.Leaf, 0)
  44. }
  45. type sm struct {
  46. root *sn
  47. }
  48. func (m *sm) NewReader(...model.Reader) model.Reader {
  49. return nil
  50. }
  51. func (m *sm) NewWriter(old ...model.Writer) model.Writer {
  52. w := &sw{base: m}
  53. if len(old) == 1 {
  54. w.InitFrom(old[0])
  55. }
  56. return w
  57. }
  58. func (m *sm) Root() model.Node {
  59. return m.root
  60. }
  61. func nf() func() model.Model {
  62. return func() model.Model {
  63. r := &sn{}
  64. r.init()
  65. return &sm{root: r}
  66. }
  67. }
  68. func init() {
  69. model.ModelFactory = nf()
  70. }