Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(896)

Side by Side Diff: tools/gn/functions.cc

Issue 2095043005: Add GN split_list function (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: typo Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/gn/functions.h ('k') | tools/gn/functions_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "tools/gn/functions.h" 5 #include "tools/gn/functions.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <iostream> 8 #include <iostream>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/environment.h" 11 #include "base/environment.h"
12 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
13 #include "tools/gn/config.h" 13 #include "tools/gn/config.h"
14 #include "tools/gn/config_values_generator.h" 14 #include "tools/gn/config_values_generator.h"
15 #include "tools/gn/err.h" 15 #include "tools/gn/err.h"
16 #include "tools/gn/input_file.h" 16 #include "tools/gn/input_file.h"
17 #include "tools/gn/parse_node_value_adapter.h"
17 #include "tools/gn/parse_tree.h" 18 #include "tools/gn/parse_tree.h"
18 #include "tools/gn/pool.h" 19 #include "tools/gn/pool.h"
19 #include "tools/gn/scheduler.h" 20 #include "tools/gn/scheduler.h"
20 #include "tools/gn/scope.h" 21 #include "tools/gn/scope.h"
21 #include "tools/gn/settings.h" 22 #include "tools/gn/settings.h"
22 #include "tools/gn/template.h" 23 #include "tools/gn/template.h"
23 #include "tools/gn/token.h" 24 #include "tools/gn/token.h"
24 #include "tools/gn/value.h" 25 #include "tools/gn/value.h"
25 #include "tools/gn/value_extractors.h" 26 #include "tools/gn/value_extractors.h"
26 #include "tools/gn/variables.h" 27 #include "tools/gn/variables.h"
(...skipping 777 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 const BuildSettings::PrintCallback& cb = 805 const BuildSettings::PrintCallback& cb =
805 scope->settings()->build_settings()->print_callback(); 806 scope->settings()->build_settings()->print_callback();
806 if (cb.is_null()) 807 if (cb.is_null())
807 printf("%s", output.c_str()); 808 printf("%s", output.c_str());
808 else 809 else
809 cb.Run(output); 810 cb.Run(output);
810 811
811 return Value(); 812 return Value();
812 } 813 }
813 814
815 // split_list ------------------------------------------------------------------
816
817 const char kSplitList[] = "split_list";
818 const char kSplitList_HelpShort[] =
819 "split_list: Splits a list into N different sub-lists.";
820 const char kSplitList_Help[] =
821 "split_list: Splits a list into N different sub-lists.\n"
822 "\n"
823 " result = split_list(input, n)\n"
824 "\n"
825 " Given a list and a number N, splits the list into N sub-lists of\n"
826 " approximately equal size. The return value is a list of the sub-lists.\n"
827 " The result will always be a list of size N. If N is greater than the\n"
828 " number of elements in the input, it will be padded with empty lists.\n"
829 "\n"
830 " The expected use is to divide source files into smaller uniform\n"
831 " chunks.\n"
832 "\n"
833 "Example\n"
834 "\n"
835 " The code:\n"
836 " mylist = [1, 2, 3, 4, 5, 6]\n"
837 " print(split_list(mylist, 3))\n"
838 "\n"
839 " Will print:\n"
840 " [[1, 2], [3, 4], [5, 6]\n";
841 Value RunSplitList(Scope* scope,
842 const FunctionCallNode* function,
843 const ListNode* args_list,
844 Err* err) {
845 const auto& args_vector = args_list->contents();
846 if (args_vector.size() != 2) {
847 *err = Err(function, "Wrong number of arguments to split_list().",
848 "Expecting exactly two.");
849 return Value();
850 }
851
852 ParseNodeValueAdapter list_adapter;
853 if (!list_adapter.InitForType(scope, args_vector[0].get(), Value::LIST, err))
854 return Value();
855 const std::vector<Value>& input = list_adapter.get().list_value();
856
857 ParseNodeValueAdapter count_adapter;
858 if (!count_adapter.InitForType(scope, args_vector[1].get(), Value::INTEGER,
859 err))
860 return Value();
861 int64_t count = count_adapter.get().int_value();
862 if (count <= 0) {
863 *err = Err(function, "Requested result size is not positive.");
864 return Value();
865 }
866
867 Value result(function, Value::LIST);
868 result.list_value().resize(count);
869
870 // Every result list gets at least this many items in it.
871 int64_t min_items_per_list = static_cast<int64_t>(input.size()) / count;
872
873 // This many result lists get an extra item which is the remainder from above.
874 int64_t extra_items = static_cast<int64_t>(input.size()) % count;
875
876 // Allocate all lists that have a remainder assigned to them (max items).
877 int64_t max_items_per_list = min_items_per_list + 1;
878 auto last_item_end = input.begin();
879 for (int64_t i = 0; i < extra_items; i++) {
880 result.list_value()[i] = Value(function, Value::LIST);
881
882 auto begin_add = last_item_end;
883 last_item_end += max_items_per_list;
884 result.list_value()[i].list_value().assign(begin_add, last_item_end);
885 }
886
887 // Allocate all smaller items that don't have a remainder.
888 for (int64_t i = extra_items; i < count; i++) {
889 result.list_value()[i] = Value(function, Value::LIST);
890
891 auto begin_add = last_item_end;
892 last_item_end += min_items_per_list;
893 result.list_value()[i].list_value().assign(begin_add, last_item_end);
894 }
895
896 return result;
897 }
898
814 // ----------------------------------------------------------------------------- 899 // -----------------------------------------------------------------------------
815 900
816 FunctionInfo::FunctionInfo() 901 FunctionInfo::FunctionInfo()
817 : self_evaluating_args_runner(nullptr), 902 : self_evaluating_args_runner(nullptr),
818 generic_block_runner(nullptr), 903 generic_block_runner(nullptr),
819 executed_block_runner(nullptr), 904 executed_block_runner(nullptr),
820 no_block_runner(nullptr), 905 no_block_runner(nullptr),
821 help_short(nullptr), 906 help_short(nullptr),
822 help(nullptr), 907 help(nullptr),
823 is_target(false) { 908 is_target(false) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 INSERT_FUNCTION(GetTargetOutputs, false) 1001 INSERT_FUNCTION(GetTargetOutputs, false)
917 INSERT_FUNCTION(Import, false) 1002 INSERT_FUNCTION(Import, false)
918 INSERT_FUNCTION(Pool, false) 1003 INSERT_FUNCTION(Pool, false)
919 INSERT_FUNCTION(Print, false) 1004 INSERT_FUNCTION(Print, false)
920 INSERT_FUNCTION(ProcessFileTemplate, false) 1005 INSERT_FUNCTION(ProcessFileTemplate, false)
921 INSERT_FUNCTION(ReadFile, false) 1006 INSERT_FUNCTION(ReadFile, false)
922 INSERT_FUNCTION(RebasePath, false) 1007 INSERT_FUNCTION(RebasePath, false)
923 INSERT_FUNCTION(SetDefaults, false) 1008 INSERT_FUNCTION(SetDefaults, false)
924 INSERT_FUNCTION(SetDefaultToolchain, false) 1009 INSERT_FUNCTION(SetDefaultToolchain, false)
925 INSERT_FUNCTION(SetSourcesAssignmentFilter, false) 1010 INSERT_FUNCTION(SetSourcesAssignmentFilter, false)
1011 INSERT_FUNCTION(SplitList, false)
926 INSERT_FUNCTION(Template, false) 1012 INSERT_FUNCTION(Template, false)
927 INSERT_FUNCTION(Tool, false) 1013 INSERT_FUNCTION(Tool, false)
928 INSERT_FUNCTION(Toolchain, false) 1014 INSERT_FUNCTION(Toolchain, false)
929 INSERT_FUNCTION(ToolchainArgs, false) 1015 INSERT_FUNCTION(ToolchainArgs, false)
930 INSERT_FUNCTION(WriteFile, false) 1016 INSERT_FUNCTION(WriteFile, false)
931 1017
932 #undef INSERT_FUNCTION 1018 #undef INSERT_FUNCTION
933 } 1019 }
934 }; 1020 };
935 const FunctionInfoInitializer function_info; 1021 const FunctionInfoInitializer function_info;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 } 1097 }
1012 1098
1013 // Otherwise it's a no-block function. 1099 // Otherwise it's a no-block function.
1014 if (!VerifyNoBlockForFunctionCall(function, block, err)) 1100 if (!VerifyNoBlockForFunctionCall(function, block, err))
1015 return Value(); 1101 return Value();
1016 return found_function->second.no_block_runner(scope, function, 1102 return found_function->second.no_block_runner(scope, function,
1017 args.list_value(), err); 1103 args.list_value(), err);
1018 } 1104 }
1019 1105
1020 } // namespace functions 1106 } // namespace functions
OLDNEW
« no previous file with comments | « tools/gn/functions.h ('k') | tools/gn/functions_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698