mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2025-08-03 12:49:50 +00:00
destructive change sprout::generate -> sprout::unfold
add range adapter reversed, replaced, filtered
This commit is contained in:
parent
6b3f7ad894
commit
73ead93fe5
60 changed files with 3840 additions and 318 deletions
211
sprout/brainfuck/brainfuck.hpp
Normal file
211
sprout/brainfuck/brainfuck.hpp
Normal file
|
@ -0,0 +1,211 @@
|
|||
#ifndef SPROUT_BRAINFUCK_BRAINFUCK_HPP
|
||||
#define SPROUT_BRAINFUCK_BRAINFUCK_HPP
|
||||
|
||||
#include <cstddef>
|
||||
#include <iterator>
|
||||
#include <stdexcept>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/array.hpp>
|
||||
#include <sprout/pit.hpp>
|
||||
#include <sprout/iterator/operation.hpp>
|
||||
#include <sprout/iterator/value_iterator.hpp>
|
||||
#include <sprout/container/traits.hpp>
|
||||
#include <sprout/container/functions.hpp>
|
||||
#include <sprout/algorithm/fixed/result_of.hpp>
|
||||
#include <sprout/algorithm/fixed/copy.hpp>
|
||||
#include <sprout/operation/fixed/set.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace brainfuck {
|
||||
namespace detail {
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR InputIterator
|
||||
find_scope_end(InputIterator first, std::size_t count = 0) {
|
||||
typedef typename std::iterator_traits<InputIterator>::value_type value_type;
|
||||
return *first == value_type('[') ? sprout::brainfuck::detail::find_scope_end(sprout::next(first), count + 1)
|
||||
: *first == value_type(']') ? count == 0
|
||||
? first
|
||||
: sprout::brainfuck::detail::find_scope_end(sprout::next(first), count - 1)
|
||||
: sprout::brainfuck::detail::find_scope_end(sprout::next(first), count)
|
||||
;
|
||||
}
|
||||
|
||||
template<typename BidirectionalIterator>
|
||||
inline SPROUT_CONSTEXPR BidirectionalIterator
|
||||
find_scope_start(BidirectionalIterator first, std::size_t count = 0) {
|
||||
typedef typename std::iterator_traits<BidirectionalIterator>::value_type value_type;
|
||||
return *first == value_type(']') ? sprout::brainfuck::detail::find_scope_start(sprout::prev(first), count + 1)
|
||||
: *first == value_type('[') ? count == 0
|
||||
? first
|
||||
: sprout::brainfuck::detail::find_scope_start(sprout::prev(first), count - 1)
|
||||
: sprout::brainfuck::detail::find_scope_start(sprout::prev(first), count)
|
||||
;
|
||||
}
|
||||
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR bool
|
||||
is_well_formed(InputIterator first, InputIterator last, std::size_t count = 0) {
|
||||
typedef typename std::iterator_traits<InputIterator>::value_type value_type;
|
||||
return first == last ? count == 0
|
||||
: *first == value_type('[')
|
||||
? sprout::brainfuck::detail::is_well_formed(sprout::next(first), last, count + 1)
|
||||
: *first == value_type(']')
|
||||
? count != 0 && sprout::brainfuck::detail::is_well_formed(sprout::next(first), last, count - 1)
|
||||
: sprout::brainfuck::detail::is_well_formed(sprout::next(first), last, count)
|
||||
;
|
||||
}
|
||||
|
||||
template<
|
||||
typename SourceBidirectionalIterator, typename Output, typename InputInputIterator,
|
||||
typename Buffer, typename OutputBuffer
|
||||
>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec_impl(
|
||||
SourceBidirectionalIterator first, SourceBidirectionalIterator last,
|
||||
Output const& output, InputInputIterator in_first, InputInputIterator in_last,
|
||||
Buffer const& buffer, OutputBuffer const& out_buffer, std::size_t pos = 0, std::size_t out_pos = 0
|
||||
)
|
||||
{
|
||||
typedef typename std::iterator_traits<SourceBidirectionalIterator>::value_type value_type;
|
||||
typedef typename sprout::container_traits<OutputBuffer>::value_type out_value_type;
|
||||
return first == last ? sprout::fixed::copy(out_buffer.begin(), out_buffer.end(), output)
|
||||
: *first == value_type('>')
|
||||
? sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, in_first, in_last,
|
||||
buffer, out_buffer, pos + 1, out_pos
|
||||
)
|
||||
: *first == value_type('<')
|
||||
? sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, in_first, in_last,
|
||||
buffer, out_buffer, pos - 1, out_pos
|
||||
)
|
||||
: *first == value_type('+')
|
||||
? sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, in_first, in_last,
|
||||
sprout::fixed::set(buffer, pos, value_type(buffer.at(pos) + 1)), out_buffer, pos, out_pos
|
||||
)
|
||||
: *first == value_type('-')
|
||||
? sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, in_first, in_last,
|
||||
sprout::fixed::set(buffer, pos, value_type(buffer.at(pos) - 1)), out_buffer, pos, out_pos
|
||||
)
|
||||
: *first == value_type('.') ? out_pos != out_buffer.size()
|
||||
? sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, in_first, in_last,
|
||||
buffer, sprout::fixed::set(out_buffer, out_pos, out_value_type(buffer.at(pos))), pos, out_pos + 1
|
||||
)
|
||||
: throw std::out_of_range("output out of range")
|
||||
: *first == value_type(',') ? in_first != in_last
|
||||
? sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, sprout::next(in_first), in_last,
|
||||
sprout::fixed::set(buffer, pos, value_type(*in_first)), out_buffer, pos, out_pos
|
||||
)
|
||||
: throw std::out_of_range("input out of range")
|
||||
: *first == value_type('[') ? buffer.at(pos) == 0
|
||||
? sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(sprout::brainfuck::detail::find_scope_end(sprout::next(first))), last, output, in_first, in_last,
|
||||
buffer, out_buffer, pos, out_pos
|
||||
)
|
||||
: sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, in_first, in_last,
|
||||
buffer, out_buffer, pos, out_pos
|
||||
)
|
||||
: *first == value_type(']') ? buffer.at(pos) != 0
|
||||
? sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(sprout::brainfuck::detail::find_scope_start(sprout::prev(first))), last, output, in_first, in_last,
|
||||
buffer, out_buffer, pos, out_pos
|
||||
)
|
||||
: sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, in_first, in_last,
|
||||
buffer, out_buffer, pos, out_pos
|
||||
)
|
||||
: sprout::brainfuck::detail::exec_impl(
|
||||
sprout::next(first), last, output, in_first, in_last,
|
||||
buffer, out_buffer, pos, out_pos
|
||||
)
|
||||
;
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
//
|
||||
// exec
|
||||
//
|
||||
template<std::size_t BufferSize = 32, typename SourceBidirectionalIterator, typename Output, typename InputInputIterator>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec(
|
||||
SourceBidirectionalIterator first, SourceBidirectionalIterator last,
|
||||
Output const& output, InputInputIterator in_first, InputInputIterator in_last
|
||||
)
|
||||
{
|
||||
typedef typename std::iterator_traits<SourceBidirectionalIterator>::value_type value_type;
|
||||
typedef sprout::container_traits<Output> out_traits;
|
||||
return sprout::brainfuck::detail::exec_impl(
|
||||
first, last, output, in_first, in_last,
|
||||
sprout::array<value_type, BufferSize>{{}}, sprout::array<typename out_traits::value_type, out_traits::static_size>{{}}
|
||||
);
|
||||
}
|
||||
template<std::size_t BufferSize = 32, typename SourceBidirectionalIterator, typename Output>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec(
|
||||
SourceBidirectionalIterator first, SourceBidirectionalIterator last,
|
||||
Output const& output
|
||||
)
|
||||
{
|
||||
typedef typename std::iterator_traits<SourceBidirectionalIterator>::value_type value_type;
|
||||
return sprout::brainfuck::exec<BufferSize>(
|
||||
first, last, output, sprout::value_iterator<value_type>(value_type()), sprout::value_iterator<value_type>()
|
||||
);
|
||||
}
|
||||
template<std::size_t BufferSize = 32, typename SourceBidirectionalIterator>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<
|
||||
sprout::array<typename std::iterator_traits<SourceBidirectionalIterator>::value_type, BufferSize>
|
||||
>::type
|
||||
exec(
|
||||
SourceBidirectionalIterator first, SourceBidirectionalIterator last
|
||||
)
|
||||
{
|
||||
typedef typename std::iterator_traits<SourceBidirectionalIterator>::value_type value_type;
|
||||
return sprout::brainfuck::exec<BufferSize>(
|
||||
first, last, sprout::pit<sprout::array<value_type, BufferSize> >()
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// exec_range
|
||||
//
|
||||
template<std::size_t BufferSize = 32, typename Source, typename Output, typename Input>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec_range(Source const& source, Output const& output, Input const& input) {
|
||||
return sprout::brainfuck::exec<BufferSize>(
|
||||
sprout::begin(source), sprout::end(source), output, sprout::begin(input), sprout::end(input)
|
||||
);
|
||||
}
|
||||
template<std::size_t BufferSize = 32, typename Source, typename Output>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec_range(Source const& source, Output const& output) {
|
||||
return sprout::brainfuck::exec<BufferSize>(
|
||||
sprout::begin(source), sprout::end(source), output
|
||||
);
|
||||
}
|
||||
template<std::size_t BufferSize = 32, typename Source>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<
|
||||
sprout::array<typename sprout::container_traits<Source>::value_type, BufferSize>
|
||||
>::type
|
||||
exec_range(Source const& source) {
|
||||
return sprout::brainfuck::exec<BufferSize>(
|
||||
sprout::begin(source), sprout::end(source)
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// is_well_formed
|
||||
//
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR bool
|
||||
is_well_formed(InputIterator first, InputIterator last) {
|
||||
return sprout::brainfuck::detail::is_well_formed(first, last);
|
||||
}
|
||||
} // namespace brainfuck
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_BRAINFUCK_BRAINFUCK_HPP
|
30
sprout/brainfuck/detail/convert.hpp
Normal file
30
sprout/brainfuck/detail/convert.hpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
#ifndef SPROUT_BRAINFUCK_DETAIL_CONVERT_HPP
|
||||
#define SPROUT_BRAINFUCK_DETAIL_CONVERT_HPP
|
||||
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/container/functions.hpp>
|
||||
#include <sprout/algorithm/fixed/result_of.hpp>
|
||||
#include <sprout/algorithm/fixed/copy.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace brainfuck {
|
||||
namespace detail {
|
||||
template<typename Result, typename Parsed>
|
||||
inline SPROUT_CONSTEXPR sprout::pair<typename sprout::fixed::result_of::algorithm<Result>::type, bool>
|
||||
parsed_to_brainfuck(Parsed const& parsed, Result const& result) {
|
||||
return parsed.success()
|
||||
? sprout::pair<typename sprout::fixed::result_of::algorithm<Result>::type, bool>(
|
||||
sprout::fixed::copy(sprout::begin(parsed.attr()), sprout::end(parsed.attr()), result),
|
||||
true
|
||||
)
|
||||
: sprout::pair<typename sprout::fixed::result_of::algorithm<Result>::type, bool>(
|
||||
sprout::deep_copy(result),
|
||||
false
|
||||
)
|
||||
;
|
||||
}
|
||||
} // namespace detail
|
||||
} // namespace brainfuck
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_BRAINFUCK_DETAIL_CONVERT_HPP
|
92
sprout/brainfuck/misa.hpp
Normal file
92
sprout/brainfuck/misa.hpp
Normal file
|
@ -0,0 +1,92 @@
|
|||
#ifndef SPROUT_BRAINFUCK_MISA_HPP
|
||||
#define SPROUT_BRAINFUCK_MISA_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/utility/pair.hpp>
|
||||
#include <sprout/container/traits.hpp>
|
||||
#include <sprout/container/functions.hpp>
|
||||
#include <sprout/algorithm/fixed/result_of.hpp>
|
||||
#include <sprout/weed/parse.hpp>
|
||||
#include <sprout/weed/parser/lim.hpp>
|
||||
#include <sprout/weed/parser/lit.hpp>
|
||||
#include <sprout/weed/parser/char/char.hpp>
|
||||
#include <sprout/weed/parser/char/char_class.hpp>
|
||||
#include <sprout/weed/parser/string/string.hpp>
|
||||
#include <sprout/weed/parser/directive/replace.hpp>
|
||||
#include <sprout/weed/operator.hpp>
|
||||
#include <sprout/brainfuck/detail/convert.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace brainfuck {
|
||||
namespace misa {
|
||||
//
|
||||
// to_brainfuck
|
||||
//
|
||||
template<typename InputIterator, typename Result>
|
||||
inline SPROUT_CONSTEXPR sprout::pair<typename sprout::fixed::result_of::algorithm<Result>::type, bool>
|
||||
to_brainfuck(InputIterator first, InputIterator last, Result const& result) {
|
||||
return sprout::brainfuck::detail::parsed_to_brainfuck(
|
||||
sprout::weed::parse(
|
||||
first, last,
|
||||
*sprout::weed::lim<sprout::container_traits<Result>::static_size>(
|
||||
sprout::weed::replace('>')
|
||||
[sprout::weed::lit('>') | "→" | "~" | "ー"]
|
||||
| sprout::weed::replace('<')
|
||||
[sprout::weed::lit('<') | "←" | "★" | "☆"]
|
||||
| sprout::weed::replace('+')
|
||||
[sprout::weed::lit('+') | "あ" | "ぁ" | "お" | "ぉ"]
|
||||
| sprout::weed::replace('-')
|
||||
[sprout::weed::lit('-') | "っ" | "ッ"]
|
||||
| sprout::weed::replace('.')
|
||||
[sprout::weed::lit('.') | "!"]
|
||||
| sprout::weed::replace(',')
|
||||
[sprout::weed::lit(',') | "?"]
|
||||
| sprout::weed::replace('[')
|
||||
[sprout::weed::lit('[') | "「" | "『"]
|
||||
| sprout::weed::replace(']')
|
||||
[sprout::weed::lit(']') | "」" | "』"]
|
||||
| sprout::weed::replace(' ')
|
||||
[sprout::weed::char_]
|
||||
)
|
||||
),
|
||||
result
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// exec_range
|
||||
//
|
||||
template<std::size_t BufferSize = 32, typename Source, typename Output, typename Input>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec_range(Source const& source, Output const& output, Input const& input) {
|
||||
typedef typename sprout::container_construct_traits<Source>::copied_type copied_type;
|
||||
return sprout::brainfuck::exec_range<BufferSize>(
|
||||
sprout::brainfuck::misa::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first,
|
||||
output, input
|
||||
);
|
||||
}
|
||||
template<std::size_t BufferSize = 32, typename Source, typename Output>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec_range(Source const& source, Output const& output) {
|
||||
typedef typename sprout::container_construct_traits<Source>::copied_type copied_type;
|
||||
return sprout::brainfuck::exec_range<BufferSize>(
|
||||
sprout::brainfuck::misa::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first,
|
||||
output
|
||||
);
|
||||
}
|
||||
template<std::size_t BufferSize = 32, typename Source>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<
|
||||
sprout::array<typename sprout::container_traits<Source>::value_type, BufferSize>
|
||||
>::type
|
||||
exec_range(Source const& source) {
|
||||
typedef typename sprout::container_construct_traits<Source>::copied_type copied_type;
|
||||
return sprout::brainfuck::exec_range<BufferSize>(
|
||||
sprout::brainfuck::misa::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first
|
||||
);
|
||||
}
|
||||
} // namespace misa
|
||||
} // namespace brainfuck
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_BRAINFUCK_MISA_HPP
|
92
sprout/brainfuck/ook.hpp
Normal file
92
sprout/brainfuck/ook.hpp
Normal file
|
@ -0,0 +1,92 @@
|
|||
#ifndef SPROUT_BRAINFUCK_OOK_HPP
|
||||
#define SPROUT_BRAINFUCK_OOK_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/utility/pair.hpp>
|
||||
#include <sprout/container/traits.hpp>
|
||||
#include <sprout/container/functions.hpp>
|
||||
#include <sprout/algorithm/fixed/result_of.hpp>
|
||||
#include <sprout/weed/parse.hpp>
|
||||
#include <sprout/weed/parser/lim.hpp>
|
||||
#include <sprout/weed/parser/lit.hpp>
|
||||
#include <sprout/weed/parser/char/char.hpp>
|
||||
#include <sprout/weed/parser/char/char_class.hpp>
|
||||
#include <sprout/weed/parser/string/string.hpp>
|
||||
#include <sprout/weed/parser/directive/replace.hpp>
|
||||
#include <sprout/weed/operator.hpp>
|
||||
#include <sprout/brainfuck/detail/convert.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace brainfuck {
|
||||
namespace ook {
|
||||
//
|
||||
// to_brainfuck
|
||||
//
|
||||
template<typename InputIterator, typename Result>
|
||||
inline SPROUT_CONSTEXPR sprout::pair<typename sprout::fixed::result_of::algorithm<Result>::type, bool>
|
||||
to_brainfuck(InputIterator first, InputIterator last, Result const& result) {
|
||||
return sprout::brainfuck::detail::parsed_to_brainfuck(
|
||||
sprout::weed::parse(
|
||||
first, last,
|
||||
*sprout::weed::lim<sprout::container_traits<Result>::static_size>(
|
||||
sprout::weed::replace('>')
|
||||
["Ook." >> *sprout::weed::space_ >> "Ook?"]
|
||||
| sprout::weed::replace('>')
|
||||
["Ook?" >> *sprout::weed::space_ >> "Ook."]
|
||||
| sprout::weed::replace('>')
|
||||
["Ook." >> *sprout::weed::space_ >> "Ook."]
|
||||
| sprout::weed::replace('>')
|
||||
["Ook!" >> *sprout::weed::space_ >> "Ook!"]
|
||||
| sprout::weed::replace('>')
|
||||
["Ook!" >> *sprout::weed::space_ >> "Ook."]
|
||||
| sprout::weed::replace('>')
|
||||
["Ook." >> *sprout::weed::space_ >> "Ook!"]
|
||||
| sprout::weed::replace('>')
|
||||
["Ook!" >> *sprout::weed::space_ >> "Ook?"]
|
||||
| sprout::weed::replace('>')
|
||||
["Ook?" >> *sprout::weed::space_ >> "Ook!"]
|
||||
| sprout::weed::replace(' ')
|
||||
[sprout::weed::char_]
|
||||
)
|
||||
),
|
||||
result
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// exec_range
|
||||
//
|
||||
template<std::size_t BufferSize = 32, typename Source, typename Output, typename Input>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec_range(Source const& source, Output const& output, Input const& input) {
|
||||
typedef typename sprout::container_construct_traits<Source>::copied_type copied_type;
|
||||
return sprout::brainfuck::exec_range<BufferSize>(
|
||||
sprout::brainfuck::ook::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first,
|
||||
output, input
|
||||
);
|
||||
}
|
||||
template<std::size_t BufferSize = 32, typename Source, typename Output>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
||||
exec_range(Source const& source, Output const& output) {
|
||||
typedef typename sprout::container_construct_traits<Source>::copied_type copied_type;
|
||||
return sprout::brainfuck::exec_range<BufferSize>(
|
||||
sprout::brainfuck::ook::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first,
|
||||
output
|
||||
);
|
||||
}
|
||||
template<std::size_t BufferSize = 32, typename Source>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<
|
||||
sprout::array<typename sprout::container_traits<Source>::value_type, BufferSize>
|
||||
>::type
|
||||
exec_range(Source const& source) {
|
||||
typedef typename sprout::container_construct_traits<Source>::copied_type copied_type;
|
||||
return sprout::brainfuck::exec_range<BufferSize>(
|
||||
sprout::brainfuck::ook::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first
|
||||
);
|
||||
}
|
||||
} // namespace ook
|
||||
} // namespace brainfuck
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_BRAINFUCK_OOK_HPP
|
Loading…
Add table
Add a link
Reference in a new issue