#include "cache_context.h" #include "sequence_store.h" #include using namespace Poincare; namespace Sequence { template CacheContext::CacheContext(Context * parentContext) : m_values{{NAN, NAN},{NAN, NAN},{NAN,NAN}}, m_parentContext(parentContext) { } template const Expression CacheContext::expressionForSymbolAbstract(const SymbolAbstract & symbol, bool clone) { // [u|v|w](n(+1)?) if (symbol.type() == ExpressionNode::Type::Symbol && symbol.name()[0] >= SequenceStore::k_sequenceNames[0][0] && symbol.name()[0] <= SequenceStore::k_sequenceNames[MaxNumberOfSequences-1][0] && (strcmp(symbol.name()+1, "(n)") == 0 || strcmp(symbol.name()+1, "(n+1)") == 0)) { Symbol s = const_cast(static_cast(symbol)); return Float::Builder(m_values[nameIndexForSymbol(s)][rankIndexForSymbol(s)]); } return m_parentContext->expressionForSymbolAbstract(symbol, clone); } template void CacheContext::setExpressionForSymbolAbstract(const Expression & expression, const SymbolAbstract & symbol) { m_parentContext->setExpressionForSymbolAbstract(expression, symbol); } template void CacheContext::setValueForSymbol(T value, const Poincare::Symbol & symbol) { m_values[nameIndexForSymbol(symbol)][rankIndexForSymbol(symbol)] = value; } template int CacheContext::nameIndexForSymbol(const Poincare::Symbol & symbol) { assert(strlen(symbol.name()) == 4 || strlen(symbol.name()) == 6); // [u|v|w](n(+1)?) char name = symbol.name()[0]; assert(name >= SequenceStore::k_sequenceNames[0][0] && name <= SequenceStore::k_sequenceNames[MaxNumberOfSequences-1][0]); // u, v or w return name - 'u'; } template int CacheContext::rankIndexForSymbol(const Poincare::Symbol & symbol) { assert(strlen(symbol.name()) == 4 || strlen(symbol.name()) == 6); // u(n) or u(n+1) if (symbol.name()[3] == ')') { // .(n) return 0; } // .(n+1) return 1; } template class CacheContext; template class CacheContext; }