containers.lua 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. --
  2. --------------------------------------------------------------------------------
  3. -- FILE: containers.lua
  4. -- DESCRIPTION: protoc-gen-lua
  5. -- Google's Protocol Buffers project, ported to lua.
  6. -- https://code.google.com/p/protoc-gen-lua/
  7. --
  8. -- Copyright (c) 2010 , 林卓毅 (Zhuoyi Lin) netsnail@gmail.com
  9. -- All rights reserved.
  10. --
  11. -- Use, modification and distribution are subject to the "New BSD License"
  12. -- as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
  13. --
  14. -- COMPANY: NetEase
  15. -- CREATED: 2010年08月02日 16时15分42秒 CST
  16. --------------------------------------------------------------------------------
  17. --
  18. local setmetatable = setmetatable
  19. local table = table
  20. local rawset = rawset
  21. local error = error
  22. module "protobuf.containers"
  23. local _RCFC_meta = {
  24. add = function(self)
  25. local value = self._message_descriptor._concrete_class()
  26. local listener = self._listener
  27. rawset(self, #self + 1, value)
  28. value:_SetListener(listener)
  29. if listener.dirty == false then
  30. listener:Modified()
  31. end
  32. return value
  33. end,
  34. remove = function(self, key)
  35. local listener = self._listener
  36. table.remove(self, key)
  37. listener:Modified()
  38. end,
  39. __newindex = function(self, key, value)
  40. error("RepeatedCompositeFieldContainer Can't set value directly")
  41. end
  42. }
  43. _RCFC_meta.__index = _RCFC_meta
  44. function RepeatedCompositeFieldContainer(listener, message_descriptor)
  45. local o = {
  46. _listener = listener,
  47. _message_descriptor = message_descriptor
  48. }
  49. return setmetatable(o, _RCFC_meta)
  50. end
  51. local _RSFC_meta = {
  52. append = function(self, value)
  53. self._type_checker(value)
  54. rawset(self, #self + 1, value)
  55. self._listener:Modified()
  56. end,
  57. remove = function(self, key)
  58. table.remove(self, key)
  59. self._listener:Modified()
  60. end,
  61. __newindex = function(self, key, value)
  62. error("RepeatedCompositeFieldContainer Can't set value directly")
  63. end
  64. }
  65. _RSFC_meta.__index = _RSFC_meta
  66. function RepeatedScalarFieldContainer(listener, type_checker)
  67. local o = {}
  68. o._listener = listener
  69. o._type_checker = type_checker
  70. return setmetatable(o, _RSFC_meta)
  71. end