#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <array>
#include <memory>
#include <numeric>
class Debuggable {
public:
Debuggable(const char *tag) : tag_(tag) {}
virtual const char* describe() const { return tag_; }
virtual ~Debuggable() = default;
private:
const char *tag_;
};
class Counter : public Debuggable {
public:
Counter(int start = 0)
: Debuggable("counter"), value_(start), threshold_(0.5) {}
int increment() { return ++value_; }
int value() const { return value_; }
double threshold() const { return threshold_; }
const char* describe() const override { return "Counter::describe"; }
private:
int value_;
double threshold_;
};
std::vector<int> process_items(const std::vector<int> &items) {
std::vector<int> results;
for (auto item : items) {
int doubled = item * 2;
results.push_back(doubled);
}
return results;
}
long factorial(long n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
int inner(int x) {
int square = x * x;
return square;
}
int middle(int x) {
int y = x + 3;
int z = inner(y);
return z + 1;
}
int outer() {
int result = middle(5);
return result * 2;
}
int main() {
std::string text = "Hello, DAP!";
int number = 42;
double pi = 3.141592653589793;
bool flag = true;
std::vector<int> items = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 20};
std::map<std::string, int> mapping = {{"key_a", 100}, {"key_b", 200}};
std::array<int, 5> fixed = {10, 20, 30, 40, 50};
Counter counter(10);
std::unique_ptr<int> heap_int = std::make_unique<int>(999);
int *raw_ptr = heap_int.get();
std::cout << "text = " << text << std::endl;
std::cout << "number = " << number << std::endl;
std::cout << "pi = " << pi << std::endl;
std::cout << "flag = " << (flag ? "true" : "false") << std::endl;
auto doubled = process_items(items);
std::cout << "doubled[0] = " << doubled[0]
<< " size = " << doubled.size() << std::endl;
long fact = factorial(5);
std::cout << "factorial(5) = " << fact << std::endl;
counter.increment();
counter.increment();
std::cout << "counter = " << counter.value() << std::endl;
int outer_result = outer();
std::cout << "outer = " << outer_result << std::endl;
int x = 10, y = 20;
int z = x + y;
std::cout << "z = " << z << std::endl;
return 0;
}