summaryrefslogtreecommitdiff
path: root/xmake/core/base/object.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2017-12-06 22:27:42 +0800
committerruki <[email protected]>2017-12-08 14:10:23 +0800
commitabe87994168053e4f420a8b7ab286c65b546eaae (patch)
tree2b245ac984055954a5407198edc26128ef173984 /xmake/core/base/object.lua
parent330e8a895d4706bcc6b2247990fb72a70f54f377 (diff)
disable halfdelay for curses
Diffstat (limited to 'xmake/core/base/object.lua')
-rw-r--r--xmake/core/base/object.lua109
1 files changed, 109 insertions, 0 deletions
diff --git a/xmake/core/base/object.lua b/xmake/core/base/object.lua
new file mode 100644
index 000000000..1922b0b4d
--- /dev/null
+++ b/xmake/core/base/object.lua
@@ -0,0 +1,109 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you 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.
+--
+-- Copyright (C) 2015 - 2017, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file object.lua
+--
+
+-- define module: object
+local object = object or {}
+
+-- taken from 'std' library: http://luaforge.net/projects/stdlib/
+-- and http://lua-cui.sourceforge.net/
+--
+-- create an object/class:
+-- > object/class = parent {value, ...; field = value ...}
+-- > An object's metatable is itself.
+-- > In the initialiser, unnamed values are assigned to the fields
+-- > given by _init (assuming the default _clone).
+-- > Private fields and methods start with "_"
+-- >
+--
+-- Access an object field: object.field
+-- > Call an object method: object:method (...)
+-- > Call a class method: class.method (self, ...)
+-- >
+-- > Add a field: object.field = x
+-- > Add a method: function object:method (...) ... end
+--
+
+-- permute some indices of a table
+local function permute (p, t)
+ local u = {}
+ for i, v in pairs (t) do
+ if p[i] ~= nil then
+ u[p[i]] = v
+ else
+ u[i] = v
+ end
+ end
+ return u
+end
+
+-- make a shallow copy of a table, including any
+local function clone (t)
+ local u = setmetatable ({}, getmetatable (t))
+ for i, v in pairs (t) do
+ u[i] = v
+ end
+ return u
+end
+
+-- merge two tables
+--
+-- If there are duplicate fields, u's will be used. The metatable of
+-- the returned table is that of t
+--
+local function merge (t, u)
+ local r = clone (t)
+ for i, v in pairs (u) do
+ r[i] = v
+ end
+ return r
+end
+
+-- root object
+--
+-- List of fields to be initialised by the
+-- constructor: assuming the default _clone, the
+-- numbered values in an object constructor are
+-- assigned to the fields given in _init
+--
+local object = { _init = {} }
+setmetatable (object, object)
+
+-- object constructor
+--
+-- @param initial values for fields in
+--
+-- @return new object
+--
+function object:_clone (values)
+ local object = merge(self, permute(self._init, values or {}))
+ return setmetatable (object, object)
+end
+
+-- local x = object {}
+function object.__call (...)
+ return (...)._clone (...)
+end
+
+-- return module: object
+return object