1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
#!/bin/sh -eu
workdir=$(mktemp -d)
cleanup() {
rm -fr "$workdir"
}
trap cleanup 0 INT QUIT ABRT PIPE TERM
cd "$workdir"
out=out
<<\EOF g++ -x c++ - -o "$out" $(pkg-config --cflags --libs sigc++-3.0)
// Adapted from https://wiki.inkscape.org/wiki/Using_libsigc%252B%252B_signals
#include <sigc++/sigc++.h>
#include <iostream>
class Emitter
{
public:
void generateRandomNumbers(int n) {
for (int i = 0; i < n; i++)
signal_number_changed.emit(std::rand());
}
sigc::signal<void (int)> signal_number_changed;
};
class Receiver
{
public:
Receiver(Emitter &emitter) {
emitter.signal_number_changed.connect(
sigc::mem_fun(*this, &Receiver::_countIfOdd)
);
}
float _getOddProportion() { return (float)odd_count/calls; }
private:
int odd_count = 0;
int calls = 0;
void _countIfOdd(int i) {
calls++;
if (i%2 == 1)
odd_count++;
}
};
int main()
{
std::srand(time(nullptr));
Emitter emitter;
Receiver receiver(emitter);
emitter.generateRandomNumbers(2345);
std::cout << "Odd-even ratio is " << receiver._getOddProportion() << '\n';
return 0;
}
EOF
echo "build: OK"
./"$out"
echo "run: OK"
|