| Index: base/cpp101/factor.cc
|
| diff --git a/base/cpp101/factor.cc b/base/cpp101/factor.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..18fa229c69220ea04d4886a6c2ac1311c7396f64
|
| --- /dev/null
|
| +++ b/base/cpp101/factor.cc
|
| @@ -0,0 +1,100 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <stdio.h>
|
| +
|
| +#include "base/at_exit.h"
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +#include "base/callback.h"
|
| +#include "base/location.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| +#include "base/task_runner.h"
|
| +#include "base/threading/thread.h"
|
| +#include "base/time/time.h"
|
| +
|
| +namespace {
|
| +
|
| +bool FindNonTrivialFactor(int n, int* factor) {
|
| + // Really naive algorithm.
|
| + for (int i = 2; i < n; ++i) {
|
| + if (n % i == 0) {
|
| + *factor = i;
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +void FindNonTrivialFactorHelper(int n, int* factor, bool* found) {
|
| + *found = FindNonTrivialFactor(n, factor);
|
| +}
|
| +
|
| +void PrintStatusUpdate(base::Time start_time) {
|
| + double num_seconds = (base::Time::Now() - start_time).InSecondsF();
|
| + printf("Waited for %f seconds...\n", num_seconds);
|
| +}
|
| +
|
| +void PrintStatusUpdateRepeatedly(
|
| + const scoped_refptr<base::TaskRunner>& task_runner,
|
| + base::Time start_time,
|
| + base::TimeDelta print_interval) {
|
| + PrintStatusUpdate(start_time);
|
| + task_runner->PostDelayedTask(FROM_HERE,
|
| + base::Bind(PrintStatusUpdateRepeatedly,
|
| + task_runner,
|
| + start_time,
|
| + print_interval),
|
| + print_interval);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +int main(int argc, char* argv[]) {
|
| + base::AtExitManager exit_manager;
|
| +
|
| + if (argc <= 1) {
|
| + printf("%s: missing operand\n", argv[0]);
|
| + return -1;
|
| + }
|
| +
|
| + int n = 0;
|
| + if (!base::StringToInt(argv[1], &n) || n < 2) {
|
| + printf("%s: invalid n `%s'\n", argv[0], argv[1]);
|
| + return -1;
|
| + }
|
| +
|
| + base::Thread worker_thread("Worker thread");
|
| + CHECK(worker_thread.Start());
|
| +
|
| + base::MessageLoop main_loop;
|
| +
|
| + base::RunLoop run_loop;
|
| +
|
| + int factor = 0;
|
| + bool found = false;
|
| + worker_thread.message_loop_proxy()->PostTaskAndReply(
|
| + FROM_HERE,
|
| + base::Bind(&FindNonTrivialFactorHelper, n, &factor, &found),
|
| + run_loop.QuitClosure());
|
| +
|
| + PrintStatusUpdateRepeatedly(main_loop.message_loop_proxy(),
|
| + base::Time::Now(),
|
| + base::TimeDelta::FromSeconds(1));
|
| +
|
| + run_loop.Run();
|
| +
|
| + worker_thread.Stop();
|
| +
|
| + if (found) {
|
| + printf("found non-trivial factor %d for %d\n", factor, n);
|
| + DCHECK_EQ(n % factor, 0);
|
| + } else {
|
| + printf("%d is prime\n", n);
|
| + }
|
| +
|
| + return 0;
|
| +}
|
|
|