Index: platform_tools/android/gyp_gen/vars_dict_lib.py |
diff --git a/platform_tools/android/gyp_gen/vars_dict_lib.py b/platform_tools/android/gyp_gen/vars_dict_lib.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..eedb8a36b9c7e5adcef4e774068147a7673c2811 |
--- /dev/null |
+++ b/platform_tools/android/gyp_gen/vars_dict_lib.py |
@@ -0,0 +1,133 @@ |
+#!/usr/bin/python |
+ |
+# Copyright 2014 Google Inc. |
+# |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import collections |
+import types |
+ |
+class OrderedSet(object): |
+ """ |
+ Ordered set of unique items that supports addition and removal. |
+ """ |
+ |
+ def __init__(self): |
+ self.__li = [] |
+ |
+ def add(self, item): |
+ """ |
+ Add item, if it is not already in the set. |
+ @param item The item to add. |
+ """ |
+ if item not in self.__li: |
+ self.__li.append(item) |
+ |
+ def __contains__(self, item): |
+ """ |
+ Whether the set contains item. |
+ @param item The item to search for in the set. |
+ @return bool Whether the item is in the set. |
+ """ |
+ return item in self.__li |
+ |
+ def __iter__(self): |
+ """ |
+ Iterator for the set. |
+ """ |
+ return self.__li.__iter__() |
+ |
+ def remove(self, item): |
+ """ |
+ Remove item from the set. |
+ @param item Item to be removed. |
+ """ |
+ return self.__li.remove(item) |
+ |
+ def __len__(self): |
+ """ |
+ Number of items in the set. |
+ """ |
+ return len(self.__li) |
+ |
+ def __getitem__(self, index): |
+ """ |
+ Return item at index. |
+ """ |
+ return self.__li[index] |
+ |
+VAR_NAMES = ['LOCAL_CFLAGS', |
+ 'LOCAL_CPPFLAGS', |
+ 'LOCAL_SRC_FILES', |
+ 'LOCAL_SHARED_LIBRARIES', |
+ 'LOCAL_STATIC_LIBRARIES', |
+ 'LOCAL_C_INCLUDES', |
+ 'LOCAL_EXPORT_C_INCLUDE_DIRS', |
+ 'KNOWN_TARGETS'] |
+ |
+class VarsDict(collections.namedtuple('VarsDict', VAR_NAMES)): |
+ """ |
+ Custom class for storing the arguments to Android.mk variables. Can be |
+ treated as a dictionary with fixed keys. |
+ """ |
+ |
+ __slots__ = () |
+ |
+ def __new__(cls): |
+ lists = [] |
+ # TODO (scroggo): Is there a better way add N items? |
+ for __unused__ in range(len(VAR_NAMES)): |
+ lists.append(OrderedSet()) |
+ return tuple.__new__(cls, lists) |
+ |
+ def keys(self): |
+ """ |
+ Return the field names as strings. |
+ """ |
+ return self._fields |
+ |
+ def __getitem__(self, index): |
+ """ |
+ Return an item, indexed by a number or a string. |
+ """ |
+ if type(index) == types.IntType: |
+ # Treat the index as an array index into a tuple. |
+ return tuple.__getitem__(self, index) |
+ if type(index) == types.StringType: |
+ # Treat the index as a key into a dictionary. |
+ return eval('self.%s' % index) |
+ return None |
+ |
+ |
+def intersect(var_dict_list): |
+ """ |
+ Find the intersection of a list of VarsDicts and trim each input to its |
+ unique entries. |
+ @param var_dict_list list of VarsDicts. WARNING: each VarsDict will be |
+ modified in place, to remove the common elements! |
+ @return VarsDict containing list entries common to all VarsDicts in |
+ var_dict_list |
+ """ |
+ intersection = VarsDict() |
+ # First VarsDict |
+ var_dict_a = var_dict_list[0] |
+ # The rest. |
+ other_var_dicts = var_dict_list[1:] |
+ |
+ for key in var_dict_a.keys(): |
+ # Copy A's list, so we can continue iterating after modifying the original. |
+ a_list = list(var_dict_a[key]) |
+ for item in a_list: |
+ # If item is in all lists, add to intersection, and remove from all. |
+ in_all_lists = True |
+ for var_dict in other_var_dicts: |
+ if not item in var_dict[key]: |
+ in_all_lists = False |
+ break |
+ if in_all_lists: |
+ intersection[key].add(item) |
+ for var_dict in var_dict_list: |
+ var_dict[key].remove(item) |
+ return intersection |
+ |